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