Рассмотрим пример консольной программы для ОС Windows.
Пример. Программа выводит текст в консоли, ждет 5 секунд и завершает свою работу.
.386
.model flat,stdcall
option casemap:none
includelib kernel32.lib
include windows.inc
include kernel32.inc
.const
sTitle db 'Console Application',0
sText1 db 'This Is The Text. Sleeping 5 secs.'
.code
Lngth PROC
push EBP
mov EBP,ESP
push EAX
cld
mov EDI, dword ptr [EBP+08H]
mov EBX,EDI
mov ECX,100 ; ограничить длину строки
xor AL,AL
repne scasb ; найти символ 0
sub EDI,EBX ; длина строки, включая 0
mov EBX,EDI
dec EBX
pop EAX
pop EBP
ret 4
Lngth ENDP
Main PROC
LOCAL hStdout :DWORD
LOCAL dSize :DWORD
invoke SetConsoleTitle, offset sTitle
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hStdout,EAX
push offset sText1
call Lngth
mov dSize,EBX
invoke WriteConsole, hStdout, offset sText1, dSize, NULL, NULL
invoke Sleep, 5000d
invoke ExitProcess, NULL
Main ENDP
end Main
Вызов системных функций API win32 из программы на ассемблере подчиняется набору соглашений stdcall: именование функций – как в языке C, передача аргументов – как в языке Pascal. С точки зрения прикладного программиста и с учетом специфики Windows и MASM эти соглашения заключаются в следующем:
Соблюдение перечисленных соглашений обеспечивается компилятором автоматически. Для этого необходимо включить в начало исходного файла комбинацию директив:
.386
model flat,stdcall
Директиву .386 можно заменить на более высокую в зависимости от того, какой процессор используется. Директива model определяет сегментную модель приложения. Для всех приложений win32 она должна иметь именно такой вид.
Для вызова API функций используется оператор invoke. Приведем в качестве примера два эквивалентных фрагмента программы:
push NULL
push NULL
push dSize
push offset sText1
push hStdout
call WriteConsole
и
invoke WriteConsole, hStdout, offset sText1, dSize, NULL, NULL
Для создания исполняемого модуля консольного приложения необходимо использовать транслятор ml с параметрами:
ml /c /coff FILE.asm
и линкер link с параметрами
link /SUBSYSTEM:CONSOLE FILE.obj
Постановка задачи: разработать консольное приложение в среде программирования MASM. В качестве задачи выбрать любое консольное приложение, написанное ранее на лабораторных работах по Системному программному обеспечению в среде программирования Microsoft Visual C++.