Шаг 58.
Директивы и средства ассемблера. Разработка программ, транслируемых как в MASM, так и в TASM

    На этом шаге мы рассмотрим общую структуру программы, транслируемой разными компиляторами.

    Здесь мы рассмотрим вопрос о написании программ, которые одинаково транслировались бы и в MASM, и в TASM. Для этого прекрасно подходит условное ассемблирование. Удобнее всего использовать IFDEF и возможности трансляторов задавать символьную константу, все равно - TASM или MASM. И в ML, и в TASM32 определен ключ /D, позволяющий задавать такую константу.

    В нижеприведенном листинге представлена программа, транслируемая и в MASM, и в TASM. Программа весьма проста, но рассмотрения ее вполне достаточно для создания более сложных подобных совместимых программ.

;Пример использования условного ассемблирования
;для написания совместимой программы.
.386P
;Плоская модель памяти.
.MODEL FLAT, STDCALL
;Проверить, определена символьная константа MASM или нет.
IFDEF MASM
;Работаем в MASM.
EXTERN     ExitProcess@4:NEAR
EXTERN     MessageBoxA@16:NEAR
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib 
ELSE 
;Работаем в TASM.
EXTERN     ExitProcess:NEAR
EXTERN     MessageBoxA:NEAR
includelib c:\tasm32\lib\import32.1ib
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
Текст этой программы можно взять здесь.

    Трансляция в MASM:

ML /c /coff   /DMASM  PR58_1.ASM
LINK /SUBSYSTEM:WINDOWS   PR58_1.OBJ

    Трансляция в TASM:

TASM32  /ml   PR58_1.ASM 
TLINK32  -aa  PR58_1.OBJ

    Как видите, все сводится к проверке, определена символьная константа MASM или нет (ключ /DMASM). Еще одна сложность - добавка в конце имени @N. Эту проблему мы обходим, используя оператор =, с помощью которого переопределяем имена.

    На следующем шаге мы приведем общие сведения по использованию таймера.




Предыдущий шаг Содержание Следующий шаг