Теоретические сведения

 

Рассмотрим пример консольной программы для ОС 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++.