Мегаобучалка Главная | О нас | Обратная связь


ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №2



2016-01-02 260 Обсуждений (0)
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №2 0.00 из 5.00 0 оценок




ИЗУЧЕНИЕ ЯЗЫКА АССЕМБЛЕРА ДЛЯ

ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ

 

 

Преподаватель __________ Тронин О.А.

 

Студент РФ12-34C _____________ ________ Поляк М.Г.

 

 

Красноярск 2014

Вариант 12: Создать массив из 10 двухбайтных чисел, найти номер минимального

Рисунок 1 – Входной текстовый файл

 

Рисунок 2 – Вывод резульатата

 

model small

stack 256

 

; СЕГМЕНТ ДАННЫХ

.data

 

massiv db 'massiv.txt','$' ;для работы с входным файлом massiv.txt будем использовать имя massiv

 

vh_massiv_1 db 60 dup(0) ;создадим входной массив из 60 байт, предназначенный для записи ASCII

;кодов символов, считанных из файла massiv.txt. 60-это 40 байт на

;10-ть 16-тиричных чисел и пробелы, переносы строк и перемещение кур-

;сора в начало строки. Число 60 взято с запасом.

vh_massiv_2 db 40 dup(0) ;cоздаем массив в который запишем 40 байт с 10-тью 16-тиричными числами

;точнее с их ASCII кодами

vh_massiv_3 db 40 dup(0) ;данный массив будет содержать 40 байт не с ASCII кодами "0..9 a..f A..F"

;а непосредственно числа от 0 до 15 (от 0 до F(f) )

vh_massiv_4 dw 10 dup(0) ;Данный массив предназначен для хранения считаных 10-ти 16-тиричных чисел

m1 dw 0h ;Переменная для хранения манипулятора файла (номера открытого файла в

;программе)

nb dw 0h ;Данная переменная предназначена для хранения фактического числа символов

;считанных при чтении текстового файла

nmin db 30h ;Переменная для хранения ASCII кода номера минимального числа

x dw 10h

 

; СЕГМЕНТ КОДА

.code

 

main: ; начало основной программы

 

;Перед началом программы МК необходимо указать на область памяти, где описанны наши переменные, т.е. на

;сегмент данных. Адрес начала сегмента данных должен быть помещен в регистр сегмента данных ds

mov ax, @data

mov ds, ax

 

; очистка регистров данных

xor ax,ax

xor bx,bx

xor dx,dx

xor cx,cx

; очистка регистров указателей, которые будут использованны в качестве регистров данных

xor si,si

xor di,di

 

 

; перед началом работы с файлом его необходимо ОТКРЫТЬ

mov dx,offset massiv ; открываем фал "massiv.txt"

mov ax,3d02h ; Ax=AhAl => AH=3Dh - Функция открытия файла; AL=02h -

; - Открываем для чтения и записи

int 21h ; Командуем int 21 и в АХ появляется файловый манипулятор

; (дискриптор) - это номер файла внутри программы

mov m1,ax ; помещаем манипулятор в переменную m1. Далее будем работать именно с ним.

 

; очистка регистров

xor ax,ax

xor dx,dx

 

 

; Теперь произведем ЧТЕНИЕ из файла

mov bx,m1 ; для этого помещаем в ВХ файловый манипулятор

mov cx,60 ; в СХ число считываемых битов (60)

lea dx,vh_massiv_1 ; LEA — это сокращение от «Load Effective Address», то есть «загрузить

; эффективный адрес». Этой строчкой мы помещаем в регистр DX адрес массива

; vh_massiv_1 в который произведем чтение ASCII кодов символов из файла

mov ah,3FH ; AH=3Fh - Функция чтения файла

int 21h ; Командуем int 21 и в регистрке АХ появляется число фактически прочитанных байт

mov nb,ax ; Помещаем число практически прочитанных битов в переменую nb

 

; очистка регистров

xor ax,ax

xor bx,bx

xor dx,dx

xor cx,cx

 

 

; Сформируем массив из 40 байтов с ASCII кодами 10-ти 16-теричных чисел

metka1:

mov al,vh_massiv_1[bx] ; Загрузим bx-итый байт массива с ASCII кодами считанных символов из текстового

; фала в регистр AL, т.к. для сравнения числа с константой, оно должно быть в регистре.

cmp al,2Fh ; Ввиду того, что помимо символов "0..9 a..f A..F" в текстовом документе могут

; храниться пробелы, переносы строки и возвраты в начало строки отсчечем их ASCII коды.

; Путем cравнения ASCII кода в регистре AL с ASCII кодами пробела (32 или 20h), перено-

; са строки (10 или 0Ah) и "возварата каретки" (13 или 0Dh). Отсечем все знаки до47(2Fh)

jnle metka2 ; если больше, то переходим к метке "metka2", иначе

inc bx ; увеличиваем номер байта на 1 и

cmp bx,nb ; Повторяем цикл ровно столько раз, сколько байт было считано при чтении файла. Т.е.

; сравним номер байта в массиве и число считанных байт

jle metka1 ; Пока меньше, либо равно перейдем в начало цикла к метке metka1

 

; очистка регистров

xor ax,ax

xor bx,bx

xor si,si

jmp metka3 ; Иначе перейдем к третьей метке metka3

 

 

metka2:

mov vh_massiv_2[si],al ; Запишем в новый массив ASCII код символа "0..9 a..f A..F"

inc si ; Увеличим номер байта в новом массиве

inc bx ; Увеличим номер байта в старом массиве

cmp bx,nb ; Сравним номер байта в массиве и число считанных байт

jle metka1 ; Пока меньше, либо равно перейдем в начало цикла к метке metka1

 

; очистка регистров

xor ax,ax

xor bx,bx

xor si,si

jmp metka3 ; Иначе перейдем к третьей метке metka3

 

 

; Преобразуем ASCII коды "0..9 a..f A..F" в числа от 0 до 16

metka3:

mov dl, vh_massiv_2[bx] ; запись в регистр dl ASCII-кода из массива vh_massiv_2, bx – это номер байта

cmp dl, 60h ; сравним номер ASCII-кода символа, введенного с клавиатуры, с числом 60h (96)

jle man0 ; если код символа меньше, либо равен 96, то перейдем к метке «man0»

; если номер кода меньше 97, то это не строчные буквы «а..f», а если номер кода

; соответствует «а..f», то от него необходимо отнять 87 (57h)

sub dl, 57h ; из регистра dl отнимаем 87 и в нем остается соответственно

; (97-87=10 и 102-87=15) число от 10 до 15

jmp man2 ; переход к метке процедуры «man2» после того как в регистре dl осталось число от

; 10 до 15, его необходимо записать в массив vh_massiv3 и увеличить bx на единицу

; ( bx – номер элемента массива vh_massiv_2), что и происходит в процедуре «man2»

 

; вспомним строчку jle man0

man0:

cmp dl, 40h ; Cравнение регистра dl с числом 64 (40h), после которого идут заглавные буквы «A..F»

jle man1 ; если код символа в регистре dl меньше, либо равен 64, переходим к метке «man1»

sub dl, 37h ; а если код ASCII символа в регистре dl соответствует символам «A..F», то вычитаем

; из регистра dl 55(37h). В таком случае в регистре dl останется число от 10 до 15

; (65-55=10 и 70-55=15).

jmp man2 ; переход к метке процедуры «man2» после того как в регистре dl осталось число от

; 10 до 15, его необходимо записать в массив vh_massiv3 и увеличить bx на единицу

; ( bx – номер элемента массива vh_massiv_2), что и происходит в процедуре «man2»

 

; вспомним строчку jle man1

man1:

sub dl, 30h ; если ASCII соответствует символам от «0..9», то отнимаем 48(30h) в результате в

; регистре dl остается число от 0 до 9.

jmp man2 ; переход к метке процедуры «man2» после того как в регистре dl осталось число от

; 0 до 9, его необходимо записать в массив vh_massiv3 и увеличить bx на единицу

; ( bx – номер элемента массива vh_massiv_2), что и происходит в процедуре «man2»

 

 

man2: ; Переходим в случае, когда в регистре dl осталось число от 0 до 15 (от 0 до F)

mov vh_massiv_3[bx], dl ; записываем получившееся число из регистра в массив vh_massiv_3

inc bx ; после чего увеличиваем номер элемента массивов входного и выходного bx на 1

cmp bx, 27h ; так как у нас массив vh_massiv_2 насчитывает 40 чисел, повторяем эту процедуру «metka3»

; 40(27h) раз

jle metka3 ; если меньше, либо равно, то повторяем процедуру «metka3».

 

; очистка регистров

xor ax,ax

xor bx,bx

xor dx,dx

xor cx,cx

xor si,si

xor di,di

 

 

; Сформируем массив из 10-ти двухбайтных чисел из 40 отдельных чисел

metka4: ; создание чисел из разрядов числа т.к. считывание с клавиатуры происходит поразрядно

xor dx,dx ;dx = 0

mul x ; mul это операция умножения с одной особенностью, результат идет в регистр АХ. То есть

; АХ=АХ * 16, следовательно выполняется смещение на 4 разряда.

mov dl,vh_massiv_3[bx] ; Записываем в регистр dl число (одно из четырех)

add ax,dx ; Прибавляем в конец число. Например из 0000h получаем 0001h

inc bx ; увеличиваем bx на 1

inc ch ; увеличиваем сh на 1

 

cmp ch,03h ; сравниваем ch c числом 3

jle metka4 ; повторяем процедуру «ms» ровно четыре раза (пока ch <= 3)

 

mov vh_massiv_4[si],ax ;записываем получившееся в регистре АХ наше 4-х значное 2-х байтное число

xor ax,ax ; очищаем регистр АХ, для создания в памяти следующего числа

inc si ; увеличиваем si на 2. Ввиду того, что vh_massiv_4 это массив слов по 2 байта

inc si ;

inc cl ; увеличиваем cl на 1, этот регистр меняется от 0 до 9 и хранит число циклов

xor ch, ch ; ch = 0, регистр ch необходимо сбросить для каджого нового числа

cmp cl, 09h ; следим за числом повторов, путем сравнения cl (от 0 до 9) с чисом 9

jle metka4 ; если меньше, либо равно, то возращаемся к метке metka4 (10 раз для каждого слова)

 

; очистка регистров

xor ax,ax

xor bx,bx

xor dx,dx

xor cx,cx

xor si,si

 

 

; Найдем номер минимального числа

mov ax, vh_massiv_4[0] ; примем в качестве минимального первый элекмент массива 16-тиричных чисел

metka5:

cmp vh_massiv_4[bx], ax ; сравним минамальное число в регисте АХ со следующим числом массива

jbе metka6 ; Если не больше, перейдем к метке metka6 для записи нового минимального числа в память

inc cl ; Увеличиваем номер слова

inc bx ; Иначе увеличиваем номер байта на 2 (увеличиваем номер слова на 1)

inc bx

cmp bx,13h ; Сравним номер байта с числом 19(13h). Он меняется от 0 до 19

jle metka5 ; И возвращаемся в начало цикла к метке metka5, пока не найдем наименьшеее

jmp metka7 ; Когда найдем переходим к метке metka7

 

metka6:

mov ax,vh_massiv_4[bx] ; Запишем в регистр АХ новое минимальное число

mov nmin,cl ; Запишем номер минимального слова

add nmin,30h ; Увеличиваем номер минимального числа, до его ASCII кода, выводить будем число от0 до9

inc bx ; увеличиваем номер байта на 2 (увеличиваем номер слова на 1)

inc bx

cmp bx,13h ; Сравним номер байта с числом 19(13h). Он меняется от 0 до 19

jle metka5 ; И возвращаемся в начало цикла к метке metka5, пока не найдем наименьшеее

jmp metka7 ; Когда найдем переходим к метке metka7

 

 

;Запишем в файл, выведем на экран номер минимального числа и завершим программу

metka7:

mov ah,40h

mov bx,m1

mov cx,nb

lea dx,nmin

int 21h

 

 

mov dl,nmin

mov ah,02h ;определение функции вывода на экран символа из регистра dl

int 21h ; Командуем и выводим номер минимального числа на экран

mov ah, 01h ; Выполним задержку резульатата на экране, до введения любого символа. 01 номер функции

int 21h ; Коммандуем и ждем нажатия любой клавиши

mov ax, 4c00h ;4C00h стандартная функция выхода из программы

int 21h

end main ;конец программы с точкой входа main



2016-01-02 260 Обсуждений (0)
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №2 0.00 из 5.00 0 оценок









Обсуждение в статье: ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №2

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (260)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)