汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】
匯編-子程序參數傳遞的三種方式:
寄存器法,堆棧法,參數賦值法
子程序結構如下:
名稱 PROC FAR|NEAR;DO SOMETHINGRET [N];返回斷點地址,N可忽略,加了必須對SP進行 平棧 操作名稱 ENDP結合此結構,我們來看,
1.寄存器法
這個方法最簡單易用,但是要注意對寄存器的選擇,一般選ABCD[X]通用寄存器就可以了。
步驟如下:
1.通過MOV指令將參數存到寄存器
2.再在子程序中調用寄存器即可【注意保護寄存器】
樣例就不給了。
2.堆棧法
過程是:
1.先將參數入棧
2.然后在子程序中使用SP,BP,SI這三個寄存器,對棧值(參數)進行取出利用
樣例如下:
參數壓棧:
MOV CX,01H; 壓入初始奇數1參數PUSH CX; 壓入結束參數50MOV CX,50PUSH CX子程序參數利用:
; 利用棧指針SP取棧值MOV BP,SP; 取結束參數50,字; 棧底是高地址段MOV AX,[BP+2]; 取初始參數1MOV BX,[BP+4]注意:
在利用寄存器取值時要注意參數存儲的物理結構,本例參數都是字變量,所以以2為單位進行取值
棧的地段的地址段會越來越高
既是:例如取棧頂時:
應當取SP+2,當然寫成[SP+2]是錯的,
需要:[BP+2]
如上例。
3.參數賦值法
這一個最是麻煩,但是用會了也就沒什么了。
原理如下:
代碼段CS定義變量進行參數存儲,然后供各個程序模塊【子程序,同一源文件】使用【特殊的存取】。
將參數存放到CALL指令后的一串單元中,子程序通過返回地址【斷點地址】存取參數并修改返回地址。
步驟是:
在CALL指令調用后,在CS定義自己的數據參數
然后利用SP,BP獲取CALL指令執行后的斷點地址
此時斷點地址后就是對應的參數區
可通過SI取得對應參數
最后在RET前修改棧頂的值為參數區后的地址值【不強制規定,但一般都是】,
做PUSH(一定要先將原斷點POP)
就能越過參數區做下一步操作
樣例如下:
對參數的定義,
; call求和子程序CALL sumsub; 參數定義NUM DW 50;結束參數DW 1;初始奇數; 輸出NEXT: CALL pf子程序調用參數:
; 獲取斷點地址做SIMOV BP,SPMOV SI,[BP]; 取代碼段中變量;結束50MOV AX,CS:[SI+0]; 開始1MOV BX,CS:[SI+2];;;參數利用;;;修改當前斷點【修改棧頂的地址斷點】;清除默認斷點地址POP CX;取自己要執行的斷點位置地址MOV CX,OFFSET NEXT;修改PUSH CX RET注意:
NEXT是程序返回后要執行的位置【在參數定義后】
CX不做固定,根據自己需要可以更換寄存器,只是不能使得入棧的變量是一個立即數罷了。
在子程序取得了當前執行斷點后,開始取定義在CS中的參數,
需要修改默認段基址DS為CS
完。
可能寫的不好,但還是求贊!
努力!
總結
以上是生活随笔為你收集整理的汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的第一个oracle触发器
- 下一篇: java图形界面设计 swing之JTa