Model flat, stdcall
option casemap: none Includelib kernel32.lib Includelib kernel32.inc Includelib windows.inc Includelib user32.inc Includelib user32.lin Date z dd “ ”, 13, 10 zsize db ($-z) nz db “ne chislo null”, 13, 10 nzsize dd ($-nz) Digit dd 1 cwritten dd? stdout dd? Code start: Invoke GetStdHandle, STD_OUTPUT_HANDLE Mov stdout, eax .IF digit ==0 Invoke WriteConsoleA, stdout, ADDR z, zsize, ADDR cwritten, NULL ELSE invoke WriteConsoleA, stdout, ADDR nz, nzsize, ADDR cwritten, \ NULL ENDIF Invoke ExitProcess, 0 End start
В операциях сравнения могут использоваться и другие условия (аналогичные языку С): ! = не равно; < меньше; > больше; =< меньше или равно; => больше или равно. Следует отметить, что директивы и.ELSE не являются инструкциями процессора. Поэтому компилятор ассемблера преобразут их в настоящие инструкции cmp, jnz, jmp и другие. Замечание. В ассемблере существует два типа сравнения: для чисел со знаком используются инструкции jg и jl, и для беззнакового сравнения ja и jb. Высокоуровневая директива.IF по умолчанию используется для сравнения беззнаковых чисел. Для того чтобы сравнивать числа со знаком следует пометь одно из сравниваемых чисел операторами SDword PTR (для двойного слова), Sword PTR (для слова) или Sbyte PTR (для байта). Например: .IF SDWORD PTR digit> 0 При ассемблировании использованная в примере директива преобразуется в инструкцию jle (если меньше или равно – перейти). Ниже приведен пример использования высокоуровневых директив. Проанализировать массив данных из 16 элементов. Подсчитать и вывести на экран количество элементов, которые по значению находятся в середине диапазона от 32 до 128.
Текст программы:
.686; директива определения типа микропроцессора .model flat, stdcall; задание линейной модели памяти option casemap: none; отличие малых и больших букв Include windows.inc Include kernel32.inc Include fpu.inc Include user32.inc Include msvcrt.inc Includelib user32.lib Includelib kernel32.lib Includelib msvcrt.lib Includelib fpu.lib .data; директиваопределения данныx _c dd 10; число элементов массива Sum dd 0 op1 dd 32; дапазоны вводимых в массив чисел op2 dd 128; дапазоны вводимых в массив чисел frmt db " %d", 0 buf db 30 dup(?) stdout DWORD? stdin DWORD? cRead dd? temp dd? Mas1 dd 41 dup(0) st1 db " Vvesty masiv: " st2 db " Вывод числа элементов массива в диапазоне (32, 128)! ", 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
|