Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

Команды вызова подпрограмм call

CALL < имя подпрограммы >

7 0 7 0 7 0

┌───────┐ ┌───────┐ ┌───────┐

│ KOP │ │dispL │ │ dispH │

└───────┘ └───────┘ └───────┘

\ /

смещение адреса подпрограммы относительно адреса следующей команды

CALL OP ;OP определяет адрес входа в п/п

;косвенный внутрисегментный вызов п/п

0) IP:=IP +3;адрес следующей команды, длина команды 3 байта

1) SP:= SP – 2

2) [SP]:= IP; сохраняем в стеке адрес возврата

3) IP := IP +disp16; в IP адрес подпрограммы.

Структура подпрограммы

N_proc proc near

; ------ ---- ----

; имя директива внутрисегментная

; любая последовательность команд

; к-во push & pop должно быть одинаковым

ret

N_proc endp

Команды возврата

RET – внутресегментный возврат

KOP = C3; однобайтная команда

0) IP := IP +1;

1) [SP]--> IP

2) SP:= SP-2

RETf – возврат из дальней процедуры. На практике использование данной команды

0) IP := IP +1; не планируется

1) [SP]--> IP

2) SP:= SP+2

3) [SP]--> CS

4) SP:=SP+2

Передача параметров в процедуру

Передача параметров через общее поле памяти

Рассмотрим пример программы.

DSEG SEGMENT

A DB 10 DUP (?)

N DW ?

DSEG ENDS

CSEG SEGMENT

MAIN PROC FAR

.........................

MAIN ENDP

P1 PROC NEAR

.........................

P1 ENDP

CSEG ENDS

END MAIN

Данные, описанные в DSEG доступны из любой точки программы ассемблера, отсюда и название – «передача данных в процедуру через общее поле памяти». В нашей программе обработка массива А может осуществляться с одинаковым успехом в процедурах MAIN и P1. На Паскале такой способ называют «передача параметров в процедуру через аппарат глобальных переменных», а именно: в описанной процедуре параметры отсутствуют.

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

На Ассемблере переменные одинаково доступные для всех процедур, поэтому, хотя и можно, но не целесообразно строить программу с вложенными процедурами.

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

Пусть процедура выполняет операцию: С = А + В

MOV AX,A

MOV BX,B

CALL PSUM

MOV C,AX

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

PSUM PROC NEAR

ADD AX,BX

RET

PSUM ENDP

Параметры процедуры делят на входные и выходные. В данном примере входные параметры: регистры AX и BX, выходные – регистр AX.

Данный способ является самым быстрым, однако не основным, т. к. регистров в МП не очень много.

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

Данный способ является основным способом передачи параметров. Будет рассматриваться в следующем семестре.