主程序調用子程序是,往往需要向子程序傳遞一些參數,同樣,子程序運行的時候也需要把一些結果參數傳回給主程序,主程序與子程序之間的這種信息傳遞稱為參數傳遞,我們把主程序傳給子存續的參數稱為子程序的入口參數,把由子程序傳給主程序的參數稱為子程序的出口參數
有多種傳遞參數的方法,寄存器傳遞法,約定內存單元傳遞法,堆棧傳遞法和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
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
因為是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
4.2.4利用CALL后續區傳遞參數
CALL后續曲是指位於CALL指令后的存儲區,主程序在調用子程序之前,把入口參數存入CALL指令后面的存儲區,子程序根據保存在堆棧中的返回地址找到入口參數,這種傳遞參數的方法稱為CALL后續傳遞參數法,由於這種方法吧數據和代碼混在一起,在x86系列中使用的不多
版權所有,轉載請注明鏈接地址:http://www.cnblogs.com/fengdashen/p/3705271.html
