Конструкции времени исполнения программы
1. Условные конструкции.
а) .IF условие ... .ENDIF б) .IF условие ... .ELSE ... .ENDIF в) .IF условие 1 ... .ELSEIF условие 2 ... .ELSEIF условие 3 ... ... .ELSE ... .ENDIF
Рассмотрим следующий фрагмент, содержащий условную конструкцию и соответствующий ей ассемблерный код.
.IF EAX==12H MOV EAX,10H .ELSE MOV EAX,15Н .ENDIFэквивалентен следующему ассемблерному коду:
CMP EAX,12Н JNE NO_EQ MOV EAX,10H JMP EX_BLOK NO_EQ: MOV EAX,15Н EX_BLOK:Весьма удобная штука, но не увлекайтесь: на мой взгляд, это сильно расслабляет.
2. Цикл "пока".
.WHILE условие ... .ENDW
Пример.
WHILE EAX<64H ADD EAX,10 ENDW
Для MASM:
JMP L2 L1: ADD EAX,10Н L2: CMP EAX,64Н JB L1
Для TASM:
L1: CМР EAX,64Н JNB EXI ADD EAX,10Н JMP L1 EXI:
Есть некоторое отличие в том, как два ассемблера транслируют директивы
.IF
и .WHILE
. Транслятор TASM32 производит
автоматически оптимизацию на предмет выравнивания по границе учетверенного
слова, добавляя дополнительно команды NOP
. Это несколько ускоряет
выполнение программы, но увеличивает ее объем. Мне ближе позиция MASM.
II
Сейчас мы рассмотрим вопрос о написании программ, которые одинаково
транслировались бы и в MASM, и в TASM. Для этого прекрасно подходит условное
ассемблирование. Удобнее всего использовать IFDEF
и возможности
трансляторов задавать символьную константу, все равно - TASM или MASM. И в ML, и
в TASM32 определен ключ /D
, позволяющий задавать такую константу.
На Рис. 2.6.1 представлена программа, транслируемая и в MASM, и TASM. Программа весьма проста, но рассмотрения ее вполне достаточно для создания более сложных подобных совместимых программ.
.386P ; плоская модель .MODEL FLAT, STDCALL ; проверить, определена символьная константа MASM или нет IFDEF MASM ; работаем в MASM EXTERN ExitProcess@4:NEAR EXTERN MessageBoxA@16:NEAR includelib с:\masm32\lib\kernel32.lib includelib c:\masm32\lib\user32.lib ELSE ; работаем в TASM EXTERN ExitProcess:NEAR EXTERN MessageBoxA:NEAR includelib c:\tasm32\lib\import32.lib ExitProcess@4 = ExitProcess MessageBoxA@16 = MessageBoxA ENDIF ;----------------------------------------------------------- ;сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' MSG DB "Простая программа",0 TIT DB "Заголовок",0 _DATA ENDS ;сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: PUSH 0 PUSH OFFSET TIT PUSH OFFSET MSG PUSH 0 ; дескриптор экрана CALL MessageBoxA@16 ;----------------------------------- PUSH 0 CALL ExitProcess@4 _TEXT ENDS END STARTРис. 2.6.1. Пример использования условного ассемблирования для написания совместимой программы.
Трансляция в MASM:
ML /с /coff /DMASM PROG.ASM LINK /SUBSYSTEM:WINDOWS PROG.OBJТрансляция в TASM:
TASM32 /ml PROG.ASM TLINK32 -aa PROG.OBJКак видите, все сводится к проверке, определена символьная константа MASM или нет (ключ
/DMASM
). Еще одна сложность - добавка в конце имени@N
. Эту проблему мы обходим, используя оператор "=
", с помощью которого переопределяем имена (см. секцию "работаем в TASM").