Assembler - язык неограниченных возможностей


Передача параметров в потоке кода


В этом необычном методе передаваемые процедуре данные размещаются прямо в коде программы, сразу после команды CALL (как реализована процедура print в одной из стандартных библиотек процедур для ассемблера UCRLIB):

call print db "This ASCIZ-line will be printed",0 (следующая команда)

Чтобы прочитать параметр, процедура должна использовать его адрес, который автоматически передается в стеке как адрес возврата из процедуры. Разумеется, функция должна будет изменить адрес возврата на первый байт после конца переданных параметров перед выполнением команды RET. Например, процедуру print можно реализовать следующим образом:

print proc near push bp mov bp,sp push ax push si mov si,[bp+2] ; прочитать адрес ; возврата/начала данных cld ; установить флаг направления ; для команды lodsb print_readchar: lodsb ; прочитать байт из строки, test al,al ; если это 0 (конец строки), jz print_done ; вывод строки закончен int 29h ; вывести символ в AL на экран jmp short print_readchar print_done: mov [bp+2],si ; поместить новый адрес возврата в стек pop si pop ax pop bp ret print endp

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




Начало  Назад  Вперед