End start. Результат работы программы:
Результат работы программы:
CPU Disasm Address Hex dump Command Comments 0040100A 55 PUSH EBP; заталкиваем EBP в стек 0040100B 8BEC MOV EBP, ESP; сохраняем ESP в EBP Следует обратить внимание на то, что изменились адреса параметров функции в стеке. Это вызвано тем, что ассемблер автоматически сохраняет содержимое регистра ESP в регистре EBP, а содержимое EBP заталкивает на время работы функции в стек, изменяя, тем самым, текущий адрес. Пример: Написать программу на Ассемблере вычисления выражения: c/b + а*b где а =3; b = 6; c =9. Результат вычисления выражения сохранить в памяти. Текст программы: Директива определения команд микропроцессора Model flat, stdcall; задание линейной модели памяти option casemap: none; отличие строчных и прописных букв Includelib kernel32.lib ExitProcess proto: DWORD AddDD proto: WORD,: WORD,: WORD; прототип процедуры Data; директива определения данные Res dw 2 dup(0); резервирование 2-х слов для результата Code; директива начала кода программы start:; метка начала программы с именем start Invoke AddDD, 3, 6, 9; вызов директивы AddDD с параметрами Invoke ExitProcess, 0 AddDD proc arg1: WORD, arg2: WORD, arg3: WORD Mov eax, 0; очистка регистров Mov ebx, 0 Mov ecx, 0 Mov edx, 0 mov ax, arg3; ax= arg3 = 9 Div arg1; операция деления Mov bx, ax; сохранение частного Mov cx, dx; сохранение остатка деления mov ax, arg1; ах = arg1= 3 mul arg2; ax = ax*arg2 = 3*6=18=12h Shl edx, 16; операция сдвига в старший байт edx Mov dx, ax; запись в младший байт Add ebx, edx; результат сложения в ebx Mov res, cx; запоминание в памяти mov res+2, bx; запоминание в памяти
|