Воскресенье, 20.07.2025, 20:20 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Глава 6. Макросредства ассемблера и программирование в Windows(2)

Конструкции времени исполнения программы

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").



Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0