Skip to content

Процедуры в Assembler

В этой небольшой статье познакомимся с процедурами в 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, поэтому еще раз просмотрите код с исходниками.

Скачать исходники

На этом я с вами прощаюсь, до следующей статьи!

Опубликовано вAssembler

Будьте первым, кто оставит комментарий

    Добавить комментарий