ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №2
ИЗУЧЕНИЕ ЯЗЫКА АССЕМБЛЕРА ДЛЯ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ
Преподаватель __________ Тронин О.А.
Студент РФ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
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (263)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |