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

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

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

4.2.1利用寄存器傳遞參數spa

利用寄存器傳遞參數就是把參數放在約定的寄存器中,這種方法的優勢是實行啊你個簡單和調用方便,可是因爲寄存器的個數有限,而且寄存器每每還須要存放其餘數據所以只適合傳遞參數比較少的狀況code

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

 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利用約定的存儲單元傳遞參數blog

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

可是,這種方法要佔用必定的存儲單元而且通用性較差字符串

實現32位數值的相加get

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

 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

相關文章
相關標籤/搜索