Передача параметров между процедурами организуется по желанию программиста. — КиберПедия 

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Передача параметров между процедурами организуется по желанию программиста.

2022-10-04 28
Передача параметров между процедурами организуется по желанию программиста. 0.00 из 5.00 0 оценок
Заказать работу

1. Передача параметров через регистры МП

Например,

; процедура AX:= max {AX, BX}

max proc far

 CMP AX, BX

    JGE Max1

MOV AX, BX

Max1: RET

maxendp

; в основной процедуре

MOVAX, A; подготовка параметров

MOVBX, B; к вызову процедуры

CALLmax

MOVC, AX; сохранение результата

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

Для этого можно использовать ячейку памяти или загрузить адрес перед вызовом процедуры в регистре AX, BP, SIили DI, а в процедуре использовать косвенную или базово-индексную адресацию.

Например,

       LEABX, B

       CALL …

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

Передача параметров через регистры ограничена их небольшим количеством. Если параметров много, их передают через стек:

 - основная программа записывает в стек фактические параметры (значение или адрес);

- в процедуре используются параметры, записанные в стек.

Например,

; вызов p(a1, а2,…, ak)

PUSHa1

PUSHak

CALLp

В процедуре можно пользоваться дополнительным указателем стека BP, но в начале процедуры следует сохранить значение BP, которое использовалось в вызывающей программе (процедуре).

Например,

Pproc

PUSHBP; сохранение BP

MOVBP, SP; настройка BP на вершину стека

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

[BP + 2] – адрес возврата, занесенный в стек автоматически,

[BP + 4] – адрес последнего параметра ak.

До выхода из процедуры следует восстановить BP командой

POPBP.

Затем очистить стек от передаваемых параметров, чтобы он не переполнялся, т.е. установить в SP значение на 2*k больше, чем было после вызова процедуры.

Для этого есть 2 варианта корректного возврата из процедуры:

а) корректировать SP в вызывающей программе

; конец процедуры   ; в вызывающей программе    
POP BP CALL p
RET ADDSP, 2*k; коррекция SP
P ENDP

б) использовать команду возврата с восстановлением стека, имеющую вид

- для близкого вызова

RET {cnt}

где {cnt} – счетчик размером в слово (константное выражение)

Команда выполняет следующие действия:

IP:= StackSP:= SP + {cnt}

Тогда конец процедуры имеет вид:

POP BP

RET 2*k

p ENDP

- для дальней процедуры команда возврата имеет вид:

RET {cnt}

и выполняет следующие действия:

IP:= Stack     CS:= Stack  SP:= SP + {cnt}

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

4. Проблема сохранения регистров при обращении к процедуре.

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

Например, если в процедуре используется регистр CH, то его можно сохранить только в CX (CH->CX).

Тогда:

PUSHCX; сохранение «старого» CX

MOVCH, 0; использование CH в процедуре

POPCX; восстановление «старого» CX

Таким образом, получимв общем виде для вызова близкой процедуры с параметрами, передаваемыми через регистры и через стек.

                            {имя проц.} proc

 

PUSHBP                    для обслуживания

movBP, SP                 стека

     


PUSH                       сохранение регистров,

                                                                           используемых в процедуре


                                   тело проц.

 

                                      РОР...                    восстановление регистров

 

                                     РОР ВР                   восстановление BP

 

RET {cnt}

                           {имя проц.} ENDP

 


Поделиться с друзьями:

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.