Иллюстрированный самоучитель по SVGA

Параметры в стеке

Доступ процедур к параметрам

При входе в процедуру в верхушке стека расположен адрес возврата, а перед ним параметры. Для работы с параметрами входящие в тело процедуры команды должны иметь прямой доступ к области стека. Как было сказано выше, для этой цели удобно использовать регистр bр, но при входе в подпрограмму его содержимое не определено. Поэтому в начале подпрограммы надо сохранить исходное содержимое bр и записать в него опорный (базовый) адрес, которым является текущее значение указателя стека.

Сохранение содержимого bр нужно для того, чтобы выполнение данной подпрограммы не влияло на выполнение вызывающего модуля. При выходе из подпрограммы перед выполнением команды ret сохраненное значение надо вытолкнуть в bр.

Таким образом, большинство подпрограмм, ориентированных на работу со стеком, начинается с двух следующих команд:

push bp; сохранение исходного содержимого bpmov
bp, sp; запись в bp адреса верхушки стека

Давайте уточним, что находится в стеке после выполнения этих команд. Для определенности будем считать, что вызвана внешняя подпрограмма, имеющая два параметра, каждый из которых занимает одно слово. Микропроцессор работает в реальном режиме, поэтому адрес возврата занимает два слова. В таком случае стек содержит величины, приведенные в табл. В.1.

Таблица В.1. Вариант размещения данных в стеке.

Смещение Что находится в слове
bp+ 0 Исходное содержимое регистра bp
bp+ 2 Младшая часть адреса возврата (IP)
bp+ 4 Старшая часть адреса возврата (cs)
bp+ 6 Второй параметр подпрограммы
bp+ 8 Первый параметр подпрограммы

В соответствии с табл. В.1, при сделанных выше допущениях, полный адрес первого параметра равен ss: [bp+8], а второго – ss: [bp+6]. Как уже говорилось, сегментный регистр ss в записи операндов не указывается, поскольку в данном случае он используется по умолчанию. Например, произведение параметров можно вычислить с помощью двух команд:

mov ах, [bp+6]; ах = значение первого параметра
mul [bp+81; dx:ax = ах * значение второго параметра

В общем случае адрес параметра, т. е. значение, прибавляемое к ьр, зависит от размеров предшествующих величин и его собственного размера. Поэтому при разработке подпрограммы надо предварительно определить, что конкретно будет находиться в стеке при ее вызове.

Внешняя процедура cnvindec

Рассмотрим простую внешнюю процедуру, которая преобразует последовательность десятичных цифр, представленных в коде ASCII, в код десятичного числа. Цифры в коде ASCII получаются, например, при вводе чисел с клавиатуры. Для того чтобы результат ввода можно было использовать при вычислениях, последовательность цифр надо преобразовать в шестнадцатеричный код числа.

Алгоритм формирования десятичного числа следующий. Обозначим формируемое число как result и предположим, что в исходном состоянии result = о. В таком случае на шаге номер I значение result умножается на 10 и к произведению прибавляется код очередной цифры:

result = result * 10 + digit [I]

Перед прибавлением кода очередной цифры его надо преобразовать в двоичный код. В формате ASCII коды цифр изменяются от 30h до зэь, поэтому для преобразования из кода цифры вычитается код нуля (зсш). Кроме того, надо проверить, действительно ли очередной символ строки является цифрой, и если это не так, то процесс формирования числа прекращается.

Завершенный текст подпрограммы приведен в примере В.5. Перед ее вызовом в стеке указывается полный адрес преобразуемой строки (сегмент и смещение).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.