Обычно это
делают директивы, которые не переводятся в инструкции процессора, а лишь
управляют программой-ассемблером. Кроме инструкций процессора и директив, программа на ассемблере содержит
вызовы различных процедур, без которых она окажется голой и беспомощной
под «испепеляющим огнем процессора». Ведь программы работают не сами по
себе, а под управлением операционной системы, которая их запускает,
обеспечивает взаимодействие с внешней средой (вывод символов на экран, чтение и
запись на жесткие диски и т. д. ) и затем помогает правильно завершиться. Для
всего этого и созданы процедуры операционной системы, часто называемые
API, то есть, Application Programming Interface — интерфейс прикладных
программ. Мы будем называть их Windows API, потому что в этой книге нас будут
прежде всего интересовать системы семейства Windows 95*. Каждой процедуре Windows API передаются параметры, то есть сведения,
необходимые ей для работы. Если, например, процедура, выводит какое-то сообщение
на экран, то ей необходимо знать, где находится это сообщение, сколько в нем
символов и т. д. Самой простой процедуре ExitProcess, с которой мы вот-вот
познакомимся, требуется всего один параметр. Это код завершения — обычное
число, которое получает операционная система после окончания работы программы. Если код завершения равен нулю, система поймет, что все нормально. Ненулевой
код завершения говорит операционной системе о какой-то неполадке в программе. Процедуры операционной системы вызываются специальной директивой invoke,
за которой следует имя процедуры, а дальше — разделенный запятыми список
параметров. Например, вызов процедуры ExitProcess выглядит так:
invoke ExitProcess. О
Единственный передаваемый ей параметр — число 0 отделено от имени
процедуры запятой.
*В это семейство входят операционные системы Windows 95/NT/98/ME/2000/XP.
14 Глава 1. Начало
Процедура ExitProcess вызывается в каждой ассемблерной программе, даже если
та и не пытается взаимодействовать с чем-то кроме процессора, как, например,
наша первая программа, просто складывающая два числа (листинг 1. 1).
Листинг 1. 1. Первая программа
. 386
. model flat, stdcall
includelib \myasm\1ib\kernel32. 1 ib
ExitProcess proto :DWORD
. code
start:
mov eax. 2
add eax. 3
invoke ExitProcess. 0
end start
В ней инструкции процессора
mov eax. 2
add eax. 3
окружены директивами — специальными командами, которые должен
выполнить не процессор, а сама программа-ассемблер. Первая директива нашей
первой программы . 386 начинается с точки и показывает, для какого процессора
предназначена программа. В нашем случае это процессор Intel 80386 и более
поздние модели, ведь семейство процессоров Intel совместимо снизу вверх и то,
что умеет процессор 80386, под силу и процессорам 80486, Pentium, Pentium III,
Pentium 4 и т. д. Вторая директива . model flat, stdcall показывает, в какой среде будет «жить»
программа. В нашем случае это операционная система семейства Windows 95
(в дальнейшем будем говорить просто Windows).