Параметры в стеке
Сформированное число помещается в стек на место адреса строки. Кроме того, при возврате из подпрограммы в регистре 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-х разрядов, поэтому вычислительные операции выполняются с операндами, имеющими размер двойного слова.