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

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

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

Пример В.5. Исходный текст процедуры cnvindec.

PUBLIC cnvindec объявляем процедуру общедоступной
subr SEGMENT word public 'subr'; начало сегмента subr
ASSUME cs:subr cs ассоциируется с subr
.386 задаем тип микропроцессора
dten dd 10 константа для умножения на 10
cnvindec PROC far начало блока процедуры
push bp сохранение содержимого bp
mov bp, sp bp = sp базовый адрес в стеке
push edx сохраняем содержимое edx
push fs сохраняем содержимое fs
push si сохраняем содержимое si Ifs si,
[bp+6] fs:si = адрес начала строки текста mov dword ptr [bp+6], 0
; result = 0 очистка результата
cnvloop: xor eax, eax очистка еах
lods byte ptr fs:[s ]; al = очередной символ строки
cmp al, '0' код символа меньше кода цифры 0?
jb endcnv; › да, конец формирования числа
cmp al, '9' К°Д символа больше кода цифры 9?
ja endcnv › да, конец формирования числа
sub al, 30h вычитаем код цифры О
xchg eax, [bp+6j переставляем еах и result
mul cs:dten edx:eax = result * 10
add [bp+6], eax result = result + eax
jmp short cnvloop › на начало цикла преобразования
endcnv: pop si восстанавливаем содержимое si
pop fs восстанавливаем содержимое fs
pop edx восстанавливаем содержимое edx
pop bp восстанавливаем содержимое bp
ret возврат из подпрограммы
cnvindec ENDP конец блока процедуры
subr ENDS конец сегмента subr
END конец текста модуля

Подпрограмма примера В.5 оформлена в виде готового для компиляции модуля. Способ оформления такого модуля описан в предыдущем разделе и показан в примере В.3. Поэтому мы начнем с основного текста.

В сегменте subr перед текстом процедуры описано двойное слово dten и ему присвоено значение 10. Эта переменная используется в процедуре при умножении, она нужна потому, что операндом команды mul не может быть константа 10.

Процедура преобразования имеет имя cnvindec. Ее текст начинается с подготовки регистра bp сохранения в стеке используемых регистров. После этого в регистры fs:si загружается адрес преобразуемой строки.

Важно
Перед вызовом процедуры в стек сначала записывается сегмент, а затем смещение строки. Только при выполнении этого условия команда Ifs поместит в регистр fs код сегмента, а в регистр si – смещение
.

После загрузки адреса строки в регистры параметры не нужны и отведенное для них место используется для размещения формируемого числа. Предварительно команда mov dword ptr [bp+6], о очищает два слова стека с адресами [bp+6] и [bp+8].

Цикл формирования числа начинается с команды, имеющей метку cnvloop, и заканчивается командой jmp short cnvloop. Код формируемого числа может содержать до 32-х разрядов, поэтому вычислительные операции выполняются с операндами, имеющими размер двойного слова.

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