主程序與子程序之間的參數傳遞的四種方法


主程序調用子程序是,往往需要向子程序傳遞一些參數,同樣,子程序運行的時候也需要把一些結果參數傳回給主程序,主程序與子程序之間的這種信息傳遞稱為參數傳遞,我們把主程序傳給子存續的參數稱為子程序的入口參數,把由子程序傳給主程序的參數稱為子程序的出口參數

有多種傳遞參數的方法,寄存器傳遞法,約定內存單元傳遞法,堆棧傳遞法和CALL后續傳遞法

4.2.1利用寄存器傳遞參數

利用寄存器傳遞參數就是把參數放在約定的寄存器中,這種方法的優點是實行啊你個簡單和調用方便,但是由於寄存器的個數有限,並且寄存器往往還需要存放其他數據因此只適合傳遞參數比較少的情況

寫一個把大寫字母轉換成小寫字母的子程序

 1 ;子程序名 UPTOLW
 2 ;功能: 把大寫字母轉換成小寫字母
 3 ;入口參數:AL = 字符ASCII碼
 4 ;出口參數:AL = 字符ASCII碼
 5 ;說明:如果字符是大寫字母則轉換為小寫字母,其他的字符保持不變
 6 UPTOLW        PROC
 7             PUSHF
 8                         CMP AL,'A'
 9                         JB         UPTOLW1
10                         CMP AL,'Z'
11                         JA         UPTOLW1
12                         ADD AL,'a' - 'A'
13             UPTOLW1:POPF
14                                     RET
15             UPTOLW            ENDP
View Code

 

 4.2.2利用約定的存儲單元傳遞參數

在傳遞參數較多的情況下,可以利用約定的內存變量來傳遞參數,這種方法的優點是子程序要處理的數據或送出的結果都有獨立的存儲單元,編寫程序的時候不容易出錯

但是,這種方法要占用一定的存儲單元並且通用性較差

實現32位數值的相加

;子程序名:MADD
;功能: 32位數據的相加
;入口參數:DATA1和DATA2緩沖區中分別存放要相加的32為數據
;出口參數:DATA3緩沖區中的存放的結果
;說明:32位數據的存放采用高高低低的原則
;可能產生的經緯存放在DATA3開始的第5個字節中

 1 ;子程序名:MADD
 2 ;功能: 32位數據的相加
 3 ;入口參數:DATA1和DATA2緩沖區中分別存放要相加的32為數據
 4 ;出口參數:DATA3緩沖區中的存放的結果
 5 ;說明:32位數據的存放采用高高低低的原則
 6 ;可能產生的經緯存放在DATA3開始的第5個字節中
 7 ;
 8 MADD        PROC
 9                     PUSH        AX
10                     PUSH      CX
11                     PUSH        SI
12                     MOV        CX,2
13                     XOR        SI,SI
14 MADD1:MOV        AX,WORD PTR DATA1[SI]
15                      ADC    AX,WORD PTR DATA2[SI]
16                      MOV    WORD PTR DATA3PSI],AX]
17                      INC         SI
18                      INC         SI
19                      LOOP        MADD1
20                      MOV        AL,0
21                      ADC        AL,0
22                      MOV     BYTE PTR DATA3+4,AL
23                      POP    SI
24                      POP        CX
25                      POP    AX
26                      RET
27     MADD         ENDP
View Code

因為是32位數和32位數相加,因此加法運算要進行兩次,首先進行低兩字節的相加,然后在做高兩字節相加,在高兩字節相加的情況,要把

低兩字節相加的進位標志考慮進去

4.2.3利用堆棧傳遞參數

如果使用堆棧傳遞入口參數,那么主程序在調用子程序之前,把需要傳遞的參數依次壓入堆棧,子程序從堆棧中取入口參數,如果使用堆棧傳遞出口參數,那么子程序在返回前,把需要返回的參數存入堆棧,主程序在堆棧中取出口參數即可

利用堆棧傳遞參數可以不用占用寄存器,也無需額外使用存儲單元,由於參數和子程序的返回地址混在一起,有事還要考慮保護寄存器,所以比較復雜,通常利用堆棧傳遞參數的入口參數,而利用寄存器傳遞出口參數

;子程序名:STRLEN
;功能:測量字符串的長度
;入口參數:字符串起始地址的段值和偏移在堆棧中
;出口參數:AX = 字符串長度

 1 ;子程序名:STRLEN
 2 ;功能:測量字符串的長度
 3 ;入口參數:字符串起始地址的段值和偏移在堆棧中
 4 ;出口參數:AX = 字符串長度
 5 
 6 STRLEN        PROC
 7                         PUSH  BP
 8                         MOV       BP,SP
 9                         PUSH  DS
10                         PUSH  SI
11                         MOV   DS,[BP+6]
12                         MOV   SI,[BP+4]
13                         MOV AL,0
14     STRLEN1:CMP AL,[SI]
15                         JZ  STRLEN2
16                         INC  SI
17                         JMP STRLEN1
18     STRLEN2:MOV AX,SI
19                         SUB   AX,[BP+4]
20                         POP   SI
21                         POP   DS
22                         POP   BP
23                         RET
24         STRLEN   ENDP
View Code

 

 4.2.4利用CALL后續區傳遞參數

CALL后續曲是指位於CALL指令后的存儲區,主程序在調用子程序之前,把入口參數存入CALL指令后面的存儲區,子程序根據保存在堆棧中的返回地址找到入口參數,這種傳遞參數的方法稱為CALL后續傳遞參數法,由於這種方法吧數據和代碼混在一起,在x86系列中使用的不多

 

版權所有,轉載請注明鏈接地址:http://www.cnblogs.com/fengdashen/p/3705271.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM