Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторная 2 Архитектура компютера.docx
Скачиваний:
11
Добавлен:
12.11.2019
Размер:
296.03 Кб
Скачать

Арифметические операции Ассемблер. Команды Ассемблера

Программирование арифметических выражений в языке Ассемблер происходит через некоторые команды такие, как: mul, div, sub, add. Эти команды называются командами арифметических операций.

Mul – команда умножения. Она умножает регистр ax на то, что стоит после нее. Результат заносится в ax. Div – команда деления. Она делит регистр ax на то, что стоит после нее. Результат заносится в ax. Add – команда сложения. Слаживает два числа. Результат заносится в первый регистр. Sub – команда вычитания. Вычитает два числа. Результат заносится в первый регистр.

Пример: Написать программу на ассемблере вычисления выражения: а – e/b – de; где а =5; b =27; c = 86; е =1986; d =1112; Результат вычисления выражения сохранить в памяти. Навести значение и порядок размещения данные в памяти.

Текст программы

.686 ; директива определения типа микропроцессора .model flat,stdcall ; задание линейной модели памяти ; но соглашения ОС Windows

.data ; директива определения данные _a dw 5 ; запись в 16-разрядный амбарчик памяти с именем _а числа 5 _b dw 27 ; запись _b = 16h _c dw 86 ; запись _c = 56h _e dw 1986 ; запись _e = 7C2h _d dw 1112 ; запись _d = 458 res dw 0 ; резервирование памяти для сохранения переменной res

.code ; директива начала сегмента команд start: mov edx,0 ; очистка регистров mov ebx,0 ; очистка регистров mov ecx,0 ; очистка регистров mov ах,_e ; в регистр ах заносим число _e = 7C2h mul _d ; множим _e и _d SHL edx,16 ; делаем здвиг на 16 mov dx,ax push edx ; бросаем значение в стек mov edx,0 mov ах,_e mov cx,_b div cx ; делим ах с cx pop ecx ; достаем из стеку значения sub ecx,eax ; отнимаем mov ах,_a sub eax,ecx mov res, eax ret ; возвращение управление ОС end start ; окончание программы с именем _start

Результат работы программы

Двумерные массивы на Ассемблере. Ассемблер двумерными массивами примеры

В данном уроке паказывается ввод элементов в двумерный массив. Приводится пример нахождение максимального элемента массива в ассемблере. И происходит вывод в MessageBox.

Пример: Ввести двумерный массив размером 7 х 4. Найти наибольший элемент двумерного массива. Удалить строку с максимальным элементом.

Текст программы:

.686 ; директива определения типа микропроцессора .model flat,stdcall ; задание линейной модели памяти option casemap:none ; отличие малых и больших букв include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\fpu.inc include \masm32\include\user32.inc include \masm32\include\msvcrt.inc

includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\msvcrt.lib includelib \masm32\lib\fpu.lib

.data ; директива определения данные _c dd 28 sum dd 0 max dd 0 ; переменная для максимального числа

frmt db "%d",0 buf db 30 dup(?) stdout DWORD ? stdin DWORD ? cRead dd ? temp dd ? mas1 dd 28 dup(0) nomer dd 0 st1 db "Vvesty masiv: " st2 db "Вывод результата удаления", 0 st3 db 10 dup(0) ifmt db "Удалена %d строка. Внимание!!! Проверьте правильность ввода, чтобы результат был правильным",0

.code ; директива начала кода программы _start: lea esi, mas1 ; загрузка адреса начала массива mov ecx,_c m1: mov ebx,ecx invoke GetStdHandle,STD_OUTPUT_HANDLE mov stdout,eax invoke GetStdHandle,STD_INPUT_HANDLE mov stdin,eax invoke WriteConsoleA,stdout,ADDR st1,14,NULL,NULL ; VIVOD ST1 invoke ReadConsole,stdin,ADDR buf,20,ADDR cRead,NULL ; чтения числа как символ invoke crt_atoi,ADDR buf ; преобразовать символ в число mov [esi],eax add esi,4 mov ecx,ebx loop m1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx,_c lea esi, mas1 ; загрузка адреса начала массива mov eax [esi] ; загрузка числа m3: .IF(eax>max) ; условие mov max,eax add esi,4 ; расчет адреса нового числа mov eax[esi] loop m3

.ELSE ; иначе add esi,4 ; расчет адреса нового числа mov eax[esi] loop m3 ; перейти, если ecx не равен 0

.ENDIF ; окончание директивы высокого уровня

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx,_c lea esi, mas1 ; загрузка адреса начала массива mov eax [esi] ; загрузка числа m4:

.IF(eax == max) ; условие inc nomer add esi,4 ; расчет адреса нового числа mov eax[esi] jmp m5 loop m4

.ELSE ; иначе inc nomer add esi,4 ; расчет адреса нового числа mov eax[esi] loop m4 ; перейти, если ecx не равен 0

.ENDIF ; окончание директивы высокого уровня

m5: .IF(nomer <= 7) ; условие mov ecx,7 x1: lea esi, mas1 ; загрузка адреса начала массива mov eax [esi] ; загрузка числа mov eax,0 add esi,4 loop x1 mov nomer,1 jmp end_prog .ENDIF

.IF(nomer <=14) ; условие mov ecx,7 lea esi, mas1 ; загрузка адреса начала массива xx: add esi,4 loop xx mov ecx,7 x2: mov eax [esi] ; загрузка числа mov eax,0 add esi,4 loop x2 mov nomer,2 jmp end_prog .ENDIF

.IF(nomer <=21) ; условие mov ecx,7 lea esi, mas1 ; загрузка адреса начала массива xx2: add esi,4 loop xx2 mov ecx,7 xx3: add esi,4 loop xx3 mov ecx,7 x3: mov eax [esi] ; загрузка числа mov eax,0 add esi,4 loop x3 mov nomer,3 jmp end_prog .ENDIF

.IF(nomer <=28) ; условие mov ecx,7 lea esi, mas1 ; загрузка адреса начала массива xxx2: add esi,4 loop xxx2 mov ecx,7 xxx3: add esi,4 loop xxx3 mov ecx,7 xxx4: add esi,4 loop xxx4 mov ecx,7 x4: mov eax [esi] ; загрузка числа mov eax,0 add esi,4 loop x4 mov nomer,4 jmp end_prog .ENDIF

end_prog:

mov ebx,nomer

invoke wsprintf \ ADDR st3 \ ADDR ifmt \ ebx invoke MessageBox \ NULL \ addr st3 \ addr st2 \ MB_OK invoke ExitProcess,0 ret end _start ; конец программы

Результат работы программы: