Главная /
Ассемблер /
Для чайников /
Как вызывается процедура в Ассемблере
|
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится.
Подробнее...
|
Пример использования процедур в Ассемблере я приводил здесь. Сегодня расскажу о том, как это всё работает - как вызывается процедура и как выполняется возврат в программу.
Когда в программе встречается инструкция 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
, которая выполняет выход, но уже из программы. И, соответственно, завершает программу.
Ну вот так это всё и работает. Если остались вопросы - посмотрите видео:
|
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься».
У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение.
Подробнее...
|