Ассемблер для Windows


"Ничего не делающая" программа



Рисунок 1.1.2. "Ничего не делающая" программа.

На Рисунок 1.1.2 представлена "ничего не делающая" программа. Назовем ее PROG1. Сразу отмечу на будущее: команды микропроцессора и директивы макроассемблера будем писать заглавными буквами.

Итак, чтобы получить загружаемый модуль, выполним следующие команды:

ML /c /coff PROG1.ASM LINK /SUBSYSTEM:WINDOWS PROG1

или для Турбо Ассемблера

TASM32 /ml PROG1.ASM TLINK32 -аа PROG1.OBJ

Примем пока параметры трансляции программ как некую данность и продолжим наши изыскания.

Часто удобно разбить текст программы на несколько частей и объединять эти части еще на 1-й стадии трансляции. Это достигается посредством директивы INCLUDE. Например, один файл будет содержать код программы, а константы, данные (определение переменных) и прототипы внешних процедур помещаются в отдельные файлы. Часто такие файлы записывают с расширением .INC.

Именно такая разбивка демонстрируется в следующей программе (Рисунок 1.1.3).

;файл CONS.INC CONS1 EQU 1000 CONS2 EQU 2000 CONS3 EQU 3000 CONS4 EQU 4000 CONS5 EQU 5000 CONS6 EQU 6000 CONS7 EQU 7000 CONS8 EQU 8000 CONS9 EQU 9000 CONS10 EQU 10000 CONS11 EQU 11000 CONS12 EQU 12000

;файл DAT.INC DAT1 DWORD 0 DAT2 DWORD 0 DAT3 DWORD 0 DAT4 DWORD 0 DAT5 DWORD 0 DAT6 DWORD 0 DAT7 DWORD 0 DAT8 DWORD 0 DAT9 DWORD 0 DAT10 DWORD 0 DAT11 DWORD 0 DAT12 DWORD 0

;файл PROG1.ASM .386P ;плоская модель .MODEL FLAT, STDCALL ;подключить файл констант INCLUDE CONS.INC ;-------------------------------------------------- ;сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' ;подключить файл данных INCLUDE DAT.INC _DATA ENDS ;сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: MOV EAX,CONS1 SHL EAX,1 ; умножение на 2 MOV DAT1,EAX ;----------------------------------- MOV EAX,CONS2 SHL EAX,2 ; умножение на 4 MOV DAT2,EAX ;----------------------------------- MOV EAX, CONS3 ADD EAX, 1000 ; прибавим 1000 MOV DAT3, EAX ;----------------------------------- MOV EAX, CONS4 ADD EAX, 2000 ; прибавим 2000 MOV DAT4, EAX ;----------------------------------- MOV EAX, CONS5 SUB EAX, 3000 ; вычесть 3000 MOV DAT5, EAX ;----------------------------------- MOV EAX, CONS6 SUB EAX, 4000 ; вычесть 4000 MOV DAT6, EAX ;----------------------------------- MOV EAX, CONS7 MOV EDX, 3 IMUL EDX ; умножение на 3 MOV DAT7, EAX ;----------------------------------- MOV EAX, CONS8 MOV EDX, 7 ; умножение на 7 IMUL EDX MOV DAT8, EAX ;----------------------------------- MOV EAX, CONS9 MOV EBX, 3 ; деление на 3 MOV EDX, 0 IDIV EBX MOV DAT9, EAX ;----------------------------------- MOV EAX, CONS10 MOV EBX, 7 ; деление на 7 MOV EDX, 0 IDIV EBX MOV DAT10, EAX ;----------------------------------- MOV EAX, CONS11 SHR EAX, 1 ; деление на 2 MOV DAT11, EAX ;----------------------------------- MOV EAX, CONS12 SHR EAX, 2 ; деление на 4 MOV DAT12, EAX ;----------------------------------- RET ; выход _TEXT ENDS END START



Содержание раздела