Главная /
Ассемблер /
Для чайников /
Как вызывается процедура в Ассемблере
Пример использования процедур в Ассемблере я приводил здесь. Сегодня расскажу о том, как это всё работает - как вызывается процедура и как выполняется возврат в программу.
Когда в программе встречается инструкция CALL,
то выполняется переход к тому участку кода, где описана процедура. Этот участок кода обозначен словом
PROC и заканчивается словом ENDP. Код, который находится в этом блоке, выполняется.
Затем, в конце процедуры команда RET выполняет возврат в программу. То есть переход на тот адрес, где была вызвана процедура. И продолжается выполнение кода программы.
Пример кода:
.model tiny
.code
ORG 100h
begin:
MOV DX, offset stroka ;Адрес строки записываем в DX
CALL Write ;Здесь запоминаем адрес текущей
;команды и вызываем процедуру
;то есть переходим на адрес процедуры
RET ;Завершение программы
;Описание процедуры вывода строки
Write PROC
MOV AH, 09h
INT 21h
RET ;Завершение процедуры Write
;Здесь мы возвращаемся в то место
;программы, откуда была
;вызвана процедура
Write ENDP
stroka DB 'Hello, WORLD!$' ;Строка для вывода
END begin
Адрес (смещение) текущей команды, которая должна быть выполнена компьютером, находится в
регистре IP.
Допустим, что в нашей программе (пример выше) адрес команды CALL Write имеет значение
0103h, а адрес начала процедуры 0107h. Тогда при вызове процедуры в регистр IP
будет записано число 0107h, и программа начнёт выполнять код процедуры.
Когда мы доберёмся до команды RET в процедуре и выполним её, то в регистр IP будет записано число
0106h, потому что команда CALL Write занимает в памяти 3 байта, а
0103h + 3 = 0106h
то есть мы вернёмся в то место программы, на ту инструкцию, которая следует за CALL Write, и продолжим выполнять основную программу. Так и выполняется возврат из процедуры в программу.
В нашем примере в программе больше ничего нет - по адресу 0106h хранится команда RET, которая выполняет выход, но уже из программы. И, соответственно, завершает программу.
Ну вот так это всё и работает. Если остались вопросы - посмотрите видео: