Мегаобучалка Главная | О нас | Обратная связь


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



2018-07-06 462 Обсуждений (0)
Передача параметров через стек 0.00 из 5.00 0 оценок




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

Если ПП имеет k параметров PP(a1, a2, ….ak) размером в слово и параметры сохраняются в стеке в последовательности слева направо, то команды, реализующие обращение к ПП, должны быть следующими:

; обращение к процедуре PP pusha1 push a2 ------------- push ak call PP av: -------------  

Обращение к параметрам в процедуре можно осуществить с помощью регистра BP, присвоив ему значение SP.

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

PP procnear в стеке после вып-ия этих команд

push BP SP, BP BPст

movBP, SP + 2 av

------------ + 4 ak

-------

a1

-------

Для доступа к последнему параметру можно использовать выражение [BP + 4], например, movAX, [BP + 4] ;ak®AX

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

popBP ; восстановить старое значение BP

ret 2*k ; очистка стека от k параметров

PP endp ; возврат в вызывающую программу

n в команде retn – это количество освобождаемых байтов в стеке,

поэтому количество параметров д. б. умножено на длину параметра…..

Команда ret вначале считывает значение av, а затем удаляет из стека параметры. Очистку стека можно выполнять не в ПП, а после выхода из нее, в основной программе, сразу после команды callPP, например, командой addSP, 2*k

Каждый способ имеет свои достоинства и недостатки, если в ПП, то исполняемый код будет короче, если в основной программе, то можно вызвать ПП несколько раз с одними и теме же параметрами последовательными командами call.

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

Пример:

Push x

Push y

Push z

Call PP

PP proc near ; процедура

Push BP

Mov BP, SP

pp_xequ [BP + 8]

pp_yequ [BP + 6]

pp_zequ [BP + 4]

---------------------

MovAX, pp_x ; использование параметра x

----------------------

PopBP

Ret 6

Pp endp

Пример передачи параметров через стек.

Пусть процедура заполняет нулями массив A[0..n-1] , основная программа обращается к ней для обнуления массивов X[0..99] и Y[0..49]. Через стек в ПП передается имя массива и его размер, размер можно передавать по значению, а имя массива нужно передавать по ссылке, т.к. этот параметр является и входным и выходным.

; процедура zero_1

Zero_1 proc

PushBP ; входные

MovBP, SP ; действия

PushBX ; сохранение значений

PushCX ; регистров

movCX, [BP + 4] ; CX = n считывание из стека

movBX, [BP + 6] ; BX = A параметров

m1: movbyteptr [BX], 0 ; цикл обнуления

Inc BX ; массива

loop m1 ; A[0..n-1]

;

; восстановление регистров и выходные действия

Pop CX

Pop BX

Pop BP

Ret 4

Zero_1 endp

Фрагмент основной программы:

X DB 100 dup (?)

Y DB 50 dup (?)

------------------------

leaAX, X ; загрузка параметров:

PushAX ; адреса массива X

MovAX, 100 ; и его размера

PushAX ; в стек

Callzero_1 ; обращение к ПП

LeaAX, Y ; загрузка параметров для массива Y

puah AX ;

mov AX, 50 ;

push AX ;

Callzero_1 ; обращение к ПП

---------------------------

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

1. Передача по значению:

Mov AX, word ptr value

Call PP

2. Передача по ссылке:

Mov AX, offset value

Call PP

3. Передача параметров по возвращаемому значению объединяет передачу по значению и по ссылке: процедуре передается адрес переменной, она делает локальную копию этого параметра, работает с этой копией, а в конце процедуры записывает эту копию по переданному адресу. Этот механизм оказывается эффективным, если процедуре приходится много раз обращаться к параметру в глобальной переменной.

4. Передача параметров по результату заключается в том, что ПП передается адрес только для записи по этому адресу результата работы ПП.

5. Передача параметров по имени макроопределения. Пример:

Name macroparametr

Mov AX, parametr

Name endm

Обращение к ПП может быть таким:

Name value ; обращение к макро



2018-07-06 462 Обсуждений (0)
Передача параметров через стек 0.00 из 5.00 0 оценок









Обсуждение в статье: Передача параметров через стек

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (462)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)