Шаг 31 - Процедуры

В прошлом шаге мы с Вами посмотрели как использовать INCLUDE этот метод очень напоминает использование процедур. Но на ассемблере можно создавать настоящие процедуры. Оформляется процедура в самом простом варианте так:

Имя_Процедуры   PROC   
	;
	;   Команды
	;
	ret
Имя_Процедуры ENDP

Обратите внимание на ret - эта команда должна быть в конце процедуре и она вернет указатель команд по адресу где процедура была вызвана. Вызывается процедура командой CALL. Давайте перепишем наш прошлый пример с использованием процедур.

MODEL	TINY
STACK 100h	
DATASEG
	Hellostr DB 'Hello First Step Site $'
	str2     DB 'Step 16 $'
CODESEG		
start:	
	mov ax,@data
	mov ds,ax
	mov dx,offset Hellostr               
	CALL Write	
	mov dx,offset  str2
	CALL Write
	mov ah,04Ch
	mov al,1h
	int 21h

	Write    PROC   
		mov ah,09h
		int 21h
		ret
	Write    ENDP
end start	

Ну, а теперь давайте посмотрим в отладчике, что к чему. В момент входа в процедуру меняется указатель команд и адрес возврата заносится в стек.

31_1.gif (4932 b)

При команде ret производится возврат назад на следующую команду после вызова и этот адрес хранится в стеке:

31_2.gif (5378 b)

Давайте убедимся и посмотрим содержание стека в момент входа в процедуру. После входа в процедуру мы можем посмотреть содержание стека.

31_3.gif (2628 b)

Видите 11 у меня. А при выходе именно это число будет в IP после вызова ret

31_4.gif (3206 b)

Итак, при вызове процедуры адрес возврата хранится в стеке.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 27.12.2001