四種傳遞引數的方法
阿新 • • 發佈:2018-12-31
主程式在呼叫子程式時,往往要向子程式傳遞一些引數;同樣,子程式執行後也經常要把一些結果引數傳回給主程式。主程式與子程式之間的這種資訊傳遞稱為引數傳遞。
引數傳遞有四種方法:暫存器引數傳遞,約定儲存單元引數傳遞,利用CALL後續區進行引數傳遞,利用堆疊進行引數傳遞。
一、暫存器引數傳遞
優點是實現簡單方便,呼叫方便,但是暫存器個數有限,且暫存器往往還要存放其他資料,所以只適合用於要傳遞的引數較少的情況。
程式示例,這裡就不舉例了,利用到這種引數傳遞的例子有很多。
例如,利用ax傳入一個16位數,轉化為字串並輸出。
二、利用約定儲存單元傳遞引數
這種資料傳遞方式,資料在記憶體中,通常在資料段中,相當於全域性變數。例如,使用一個字串變數作為引數,傳入函式,輸出一個16進位制數。
三、利用堆疊傳遞引數
實現方法:主程式在呼叫子程式之前,將需要傳遞的引數依次壓入堆疊,子程式從堆疊中取入口引數;子程式呼叫結束之前,將需要返回的引數依次壓入堆疊,主程式在堆疊中取出引數。
示例:測量字串長度的子程式,設字串以0為結束標誌
;輸入引數通過堆疊傳遞引數
;輸出引數通過暫存器傳遞引數
data segment
str db '123456789',0
len dw ?
data ends
code segment
assume ds:data,cs:code
start:
mov ax,seg str
push ax
mov ax,offset str
push ax
call strlen
mov len,ax
mov ah,4ch
int 21h
code ends
strlen proc
push bp
mov bp,sp
push ds
push si
mov ds,[bp+6] ;將串的段值,載入到資料段暫存器
mov si,[bp+4] ;將串的偏移,傳給si,為讀串做準備
mov al,0
strlen1: cmp al,[si]
jz strlen2
inc si
jmp strlen1
strlen2: mov ax,si
sub ax,[bp+4]
pop si
pop ds
pop bp
ret 4
strlen endp
end start
四、利用CALL後續區傳遞引數
資料在程式碼段中,很少語言使用此方法,但使用方法接近於高階語言。
示例:測量字串長度的子程式,設字串以0為結束標誌
;輸入引數通過CALL後續區傳遞引數
;輸出引數通過暫存器傳遞引數
data segment
str db '123456789',0
len dw ?
data ends
code segment
assume ds:data,cs:code
start:
call strlen
dw offset str
dw seg str
mov len,ax
mov ah,4ch
int 21h
code ends
strlen proc
push bp
mov bp,sp
push ds
push si
mov si,[bp+2] ;將子程式返回地址,傳給si,方便引數傳遞
mov ds,cs:[si+2] ;將串的段值,載入到資料段暫存器
mov si,cs:[si] ;將串的偏移,傳給si,為讀串做準備
mov dx,si
mov al,0
strlen1: cmp al,[si]
jz strlen2
inc si
jmp strlen1
strlen2: sub si,dx
add word ptr [bp+2],4;修改返回地址
pop si
pop ds
pop bp
ret 4
strlen endp
end start