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

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

Цикл начинается с очистки регистра еах и записи в его младший байт (al) кода очередного символа. Затем проверяется, чему соответствует этот код. Если он соответствует цифре, то из содержимого al вычитается код цифры 0, производится перестановка содержимого еах и result и выполняется умножение result * 10. В связи с тем, что константа dten расположена в кодовом сегменте, в команде mui перед ней явно указано имя регистра cs. Младшая часть результата умножения (содержимое еах) прибавляется к result и происходит возврат на начало цикла формирования числа.

Если очередной символ не является цифрой, то выполнение цикла прекращается и происходит переход на метку endcnv. Начиная с этой метки расположены команды, восстанавливающие содержимое сохраненных в стеке регистров, и команда retf, завершающая выполнение подпрограммы.

Замечание
Значение формируемого подпрограммой примера В.5 числа может изменяться в пределах от 0 до 4294967295 (232 -1). Контроль переполнения результата отсутствует, это сделано для упрощения текста подпрограммы. При необходимости вы можете ввести такой контроль или увеличить диапазон допустимых значений числа. Напомним, что при умножении на 10 старшая часть произведения находится в регистре edx, но подпрограмма не работает с этим регистром
.

Использование процедуры cnvindec

Для использования в задачах модуль примера В. 5 компилируется, и полученный объектный модуль объединяется с объектным модулем основной задачи. Как это делается, описано в данном приложении. Здесь нас будет интересовать вызов подпрограммы задачей.

Предположим, что в разделе данных задачи зарезервирован буфер для размещения вводимой строки текста и ему присвоено имя linbuf. Для хранения сформированного числа в разделе данных надо зарезервировать двойное слово, присвоив ему подходящее имя, например, argument.

В задаче можно выбрать любой удобный для вас способ ввода текста строки с клавиатуры. Только не забывайте, что вводимые символы нужно отображать на экране монитора, а способ отображения зависит от установленного задачей видеорежима. В текстовых видеорежимах обычно применяется стандартная функция DOS, ее код ОАbp.

Подпрограммы для ввода текста в графических видеорежимах описаны в главе 5, а их использование показано в приложении А, Пример А.10.

После ввода строки, для формирования числа в основном тексте задачи выполняются следующие команды:

@Invoke cnvindec <ds, offset linbuf>; вызов подпрограммы
pop argument; запись сформированного числа

При компиляции, обнаружив имя einvoke, Макроассемблер ищет его в своих таблицах, и если описанное в примере В.4 макроопределение включено в текст задачи, то макровызов преобразуется в следующие три команды:

push ds; запись в стек содержимого ds
push offset linbuf; запись в стек смещения
linbuf call cnvindec; обращение к подпрограмме

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

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

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