Lectures / 12-13
.pdfДоступ к параметрам в процедуре
Дно стека
Предыд.содерж. стека 1-ый параметр
2-ой параметр
3-ий параметр Адрес возврата Исходное значение BP
8 [BP]
6 [BP]
4 [BP]
2 [BP]
Младшие адреса ОП
Доступ к параметрам в процедуре
Дно стека
Предыд.содерж. стека
1-ый параметр i
2-ой параметр j
3-ий параметр k
Адрес возврата Исходное значение BP
AX
BX
8[bp]
6 [bp]
4 [bp]
2 [bp]
0 [bp]
-2 [bp] -4 [bp]
iequ 8[bp]
jequ 6[bp]
kequ 4[bp]
xx proc near push bp mov bp, sp push ax push bx mov bx, i add bx, j add bx, k
……………….
Младшие адреса ОП
Передача параметров в потоке кода
call |
|
db |
“Этот параметр - в потоке кода”, 0 |
|
|
Print proc near push bp
mov bp, sp
….; Сохр.регистров ; BX=адр.возврата: mov bx, 2[bp] PrintSym: ...;Печать cmp cs:[bx], 0
jz EndStr
inc bx ;След.симв. jmp PrintSym EndStr: inc bx ;
;Нов.адр.возврата: mov 2[bp], bx …..; Восст.регистр. pop bp
ret
Print endp
Передача параметров в блоке
параметров
ParmBlock dd I
I |
dw ? |
J |
dw ? |
K |
dw ? |
. . .
les bx, ParmBlock call AddEm
. . .
AddEm proc near push ax
mov ax, es:2[bx] ; ax=J add ax, es:4[bx] ;ax=ax+K mov es:[bx], ax ; I=ax pop ax
ret AddEm endp
Локальные переменные
Procedure LocSt (i,j,k: integer); var L,M,N: integer;
10[BP] Пред.сод.стека |
|
|
8[BP] |
I |
|
6[BP] |
J |
|
4[BP] |
K |
|
2[BP] |
Адрес возврата |
|
[BP] |
Исх.значение BP |
BP |
-2[BP] |
AX |
|
-4[BP] |
L |
|
-6[BP] |
M |
|
-8[BP] |
N |
SP |
|
Младшие адреса |
|
IEQU 8[bp]
JEQU 6[bp]
KEQU 4[bp]
LEQU -4[bp]
MEQU -6[bp]
NEQU -8[bp] LocSt proc near
push bp mov bp, sp
push ax sub sp, 6
mov ax,L
. . .
add sp,6 pop ax pop bp ret 6
LocSt endp
Рекурсия
Вычисление N! = 1*2*3*…*N = (N-1)!*N
FUNCTION Fact (K: INTEGER): INTEGER; BEGIN
IF (K=0) THEN Fact := 1
ELSE Fact := Fact (K-1)*K; END;
……………………..
S:= Fact(N);
Рекурсия
push N
call Fact
…………………………….
Fact |
proc |
|
|
push bp |
|
|
mov |
bp,sp |
|
cmp |
word ptr bp[4],0 |
|
jnz |
cont |
|
mov |
ax,1 |
|
jmp |
exit |
cont: mov |
cx,word ptr bp[4] |
|
|
dec |
cx |
|
push |
cx |
|
call |
Fact |
|
imul |
ax,bp[4] |
exit: pop |
bp |
|
|
ret |
2 |
Fact |
endp |
|
;параметр N ;Fact(N);
;пролог ;пролог
;IF (K=0)
;THEN Fact:=1
;ELSE
;декремент параметра K
;Fact(K-1)
;Fact := Fact(K-1)*K;
;эпилог