Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

СТРУКТУРА ПОДПРОГРАММЫ

КОМАНДЫ ВЫЗОВА ПОДПРОГРАММ CALL

КОМАНДЫ ПЕРЕХОДОВ LOOPZ, LOOPE

КОМАНДА ЦИКЛА LOOP

Loop met

┌─────┐

│CX:=n│

└──┬──┘

┌──────>х met:

│ ┌──┴──┐

│ │тело │

│ │цикла│

│ └──┬──┘

│ ┌────┴────┐

│ │CX:=CX-1 │

│ └────┬────┘

│ нет / ^\ да

└────/CX=0\────┐

\ / │

\/ │

v

 

Команда Loop не проверяет и не изменяет значения флагов, она только уменьшает регистр СХ на единицу и сравнивает последний с нулём.

 

Пример: подсчитать сумму элементов массива.

 

x db 10 dup(?)

n dw?

 

sub ax,ax

lea bx,x

mov cx,n

m:

add al,[bx]

inc bx

loop m

 

 

 

Мнемоники различны, но команда одна и та же:

Loopz met (Loope met)

 

┌──────────────┤ MET:

│ ┌──────┴──────┐

│ │тело цикла с │

│ │формированием│

│ │ ZF │

│ └──────┬──────┘

│ ┌──────┴──────┐

│ │ CX:= CX-1 │

│ └──────┬──────┘

│ / \ да

│ /ZF=1 \──────────┐

│ \ / │

│ \/ │

│ │ │

│ нет / \ да │

└───────────/CX=0 \─────┬────┘

\ / │

\/ v

 

Команда имеет дополнительный выход из цикла, по значению ZF=1.

 

В массиве Х определить первый элемент, значение которого = 5.

X DW 10 DUP (?)

N DW?

NOM DW?

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

 

X ┌─────┬─────┬─────┬───────────┬─────┐

│X1=-1│ X2=2│ X3=5│......... │ Xn │

└──┴──┴──┴──┴──┴──┴───────────┴──┴──┘

 

Просмотр массива будет завершен после определения X3 = 5

mov cx,n

mov si,-2

met:

inc si

inc si

cmp [si],5

loopz met

jnz m1;в массиве нет элементов равных 5

;SI:= (nom-1)*size(x)

;nom:= SI/2 +1

;после выхода из цикла

;SI указывает на исходный элемент

shr si,1

inc si

mov nom,si

jmp kon

m1:;выдача сообщения 'в массиве нет элементов, равных 5'

 

КОМАНДЫ ПЕРЕХОДОВ LOOPNZ, LOOPNE содержат дополнительный выход из цикла при ZF=0. С помощью этой команды можно найти первый элемент массива, который <> заданному.

Команд цикла, которые проверяют условия >= и <= нет, для этого случая требуется самостоятельно организовывать доп. выход из тела цикла.

 

 

 

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

 

7 0 7 0 7 0

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

│ KOP │ │dispL │ │ dispH │

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

\ /

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

 

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

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

 

1) SP:= SP – 2

2) IP:= [SP]

3) disp --> IP

 

 

 

N_proc proc near

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

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

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

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

ret

N_proc endp

 

 

 

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

 

KOP = C3

1) [SP]--> IP

2) SP:= SP-2

 

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

 

1) [SP]--> IP

2) SP:= SP+2

3) [SP]--> CS

4) SP:=SP+2

 

 

1) Через общее поле памяти

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. На Паскале такой способ называют «передача параметров в процедуру через аппарат глобальных переменных», а именно: в описанной процедуре параметры отсутствуют.

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

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

 

MAIN PROC FAR

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

CALL P1

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

JMP OBHOD

P1 PROC NEAR

; тело процедуры

P1 ENDP

OBHOD:.............

MAIN ENDP

 

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

 

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

 

MOV AX,A

MOV BX,B

CALL PSUM

MOV C,AX

 

PSUM PROC NEAR

ADD AX,BX

RET

PSUM ENDP

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

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

 

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

 

A¤-B¤-3

x = ────── A,B – слова

(A-B)*5

 

А,В – входные параметры

АХ – результат

 

В процедуре для промежуточных результатов обычно используются свободные регистры, например нам потребовались регистры AX,BX,CX,DX,SI. В процедуре все используемые регистры, кроме регистра, через который передаются параметры, целесообразнее сохранять на стек, т. к. эти же регистры могли быть использованы в вызывающей программе.

 

SP────┐ ┌────BP

├────┤

+0 │ SI │...........................

├────┤ PUSH A

+2 │ DX │ PUSH B

├────┤ CALL P2;вызов

+4 │ CX │ MOV X,AX;процедуры

├────┤...........................

+6 │ BX │

├────┤

+8 │ IP │

├────┤

+10 │ A │

├────┤

+12 │ B │

├────┤

│ │

└────┘

P2 PROC NEAR

PUSH BX

PUSH CX

PUSH DX

PUSH SI

MOV BP,SP;прямой доступ к стеку

MOV AX,[BP+12];AX:=A

MOV BX,[BP+10];BX:=B

;вычисление формулы

;результат в AX

;восстановление регистров

POP SI

POP DX

POP CX

POP BX

; после этих действий SP указывает на адрес возврата

RET 4

; команда RET с параметром работает аналогично обычной

; команде RET, т.е. выполняет операцию POP IP, одна-

; ко в стеке остаются 2 параметра А и В, которые необ-

; ходимо удалить со стека. Дополнительное действие

; команды состоит в следущем: SP:= SP + 4.

; После выхода из процедуры SP будет указывать на

; ячейку, лежащую ниже А

P2 ENDP

Если не использовать параметры в команде RET, то вызов процедуры будет иметь вид:

 

PUSH A

PUSH B

CALL P2

MOV X,AX

; в стеке лишние 2 слова

POP AX

POP AX

В одномерном массиве поменять местами 1-й положительный и последний отрицательный.

┌───┬───┬───┬───┬───┬───┐

│ 0 │ 2 │ 4 │-8 │-16│ 3 │

└───┴───┴───┴───┴───┴───┘

SI = 0 – начальное значение

DI:= (N-1) size X

MOV CX,N

MOV SI,0

M1: CMP X[SI],0

JG M2

INC SI

INC SI

LOOP M1

GCXZ N_P_E;переход, если CX = 0

;найден положительный элемент

MOV CX,N

MOV DI,N

DEC DI

SHL DI,1;DI:=DI*2

M4: CMP X[DI],0

JL M5

DEC DI

DEC DI

LOOP M4

M5: JCXZ N_NEG_E

MOV AX,[SI]

MOV BX,[DI]

MOV [SI],BX

MOV [DI],AX

JMP KON

N_P_E: LEA DX,MSG1

MOV AH,9

INT 21h

JMP KON

N_NEG_E: LEA DX,MSG2

MOV AH,9

INT 21h

KON: RET

 

<== предыдущая лекция | следующая лекция ==>
Команды управления циклами | Функция ввода символа
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 339; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.046 сек.