日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】

發布時間:2024/4/18 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匯編-子程序參數傳遞三種方式:
寄存器法,堆棧法,參數賦值法

子程序結構如下:

名稱 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

完。
可能寫的不好,但還是求贊!
努力!

總結

以上是生活随笔為你收集整理的汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。