Арифметические операции Ассемблер. Команды Ассемблера
Программирование арифметических выражений в языке Ассемблер происходит через некоторые команды такие, как: 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 ; конец программы Результат работы программы:
|