В этой небольшой статье познакомимся с процедурами в Assembler, так как их понимание и грамотное использование открывает большие возможности перед программистом. Пример программы будет направлен на то, чтобы вы лучше могли понять как их использовать.
Простые процедуры
Начнем с простой процедуры, которая складывает 2 числа:
.386 .model flat,stdcall option casemap:none .code start: mov ax,2 mov bx,3 call Summa ; вызов процедуры ret Summa proc ; описание процедуры add ax,bx ret Summa endp end start
Начало практически стандартное, кроме одной строки: «option casemap:none». Эта строка указывает Assembler, чтобы он различал регистры, так как по умолчанию он их не различает.
Далее перейдем к самому интересному, а именно процедуре Summa: как вы заметили, эта процедура описывается в самой последней части кода перед завершением программы и само описание завершается командой endp.
Думаю, саму процедуру пояснять нет смысла, но стоит пояснить, что в нашей программе встречается 2 слова ret. Так вот, тот ret, который входит в описание, выполнят лишь выход в основную программу, а ret в основной программе, как раз выходит уже из самой программы.
Также заметьте, что вызов процедуры Assembler производится с помощью команды Call.
Процедуры Assembler с параметрами
Ну вроде бы все просто и легко, разобрались с процедурами, но все же это не так!
Поскольку мы с вами познаем все больше и больше, думаю стоит узнать, что все таки командой ret завершаться не всегда правильно, поэтому для этого существует своя процедура Assembler, которая помимо того, что завершает действие, еще и освобождает ресурсы. Эта процедура ExitProcess.
Процедура, которая принимает 1 параметр. А для того, чтобы использовать процедуры с параметром следует сначала задать прототип этой процедуры. Прототип задается с помощью слова «proto» , затем идут параметры.
.386 .model flat,stdcall option casemap:none includelib ..\LIB\kernel32.lib ; для процедуры нужно подключить библиотеку ExitProcess proto :DWORD ; прототип с 1 параметром .code start: mov ax,2 mov bx,3 call Summa invoke ExitProcess,0 ; в этой строчке она вызывается вместо ret Summa proc add ax,bx ret Summa endp end start
Прототип пишется ко всем процедурам с параметрами, и на самом деле, к нашей процедуре мы тоже могли бы использовать прототип с 2 параметрами. Это записалось бы следующим образом:
Summa proto :DWORD, :DWORD
Кстати, кто не знает, DWORD это всего лишь тип данных в Assembler, который занимает 4 байта, мы также могли использовать BYTE(1 байт) или WORD(2 байта).
А вызвать нашу процедуру могли бы так:
invoke Summa,2,3
Теперь, думаю, можем подвести итоги:
- Процедуры с параметрами требуют объявления в самом начале (зарезервированное слово proto), описания(в самом коде) , их вызов производится с помощью слова invoke
-
Процедуры без параметров требуют описания(также в самом коде), их вызов можно производить с помощью команды Call
Также отмечу, что мы будем, в основном, использовать только процедуры с параметрами в наших следующих программах на Assembler, поэтому еще раз просмотрите код с исходниками.
Скачать исходники
На этом я с вами прощаюсь, до следующей статьи!
Будьте первым, кто оставит комментарий