В прошлом шаге мы с Вами посмотрели как использовать 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
Ну, а теперь давайте посмотрим в отладчике, что к чему. В момент входа в процедуру меняется указатель команд и адрес возврата заносится в стек.
При команде ret производится возврат назад на следующую команду после вызова и этот адрес хранится в стеке:
Давайте убедимся и посмотрим содержание стека в момент входа в процедуру. После входа в процедуру мы можем посмотреть содержание стека.
Видите 11 у меня. А при выходе именно это число будет в IP после вызова ret
Итак, при вызове процедуры адрес возврата хранится в стеке.