На этом шаге мы рассмотрим общую структуру программы, транслируемой разными компиляторами.
Здесь мы рассмотрим вопрос о написании программ, которые одинаково транслировались бы и в 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. Эту проблему мы обходим, используя оператор =, с помощью которого переопределяем имена.
На следующем шаге мы приведем общие сведения по использованию таймера.