彙編語言閱讀筆記【轉移指令】

1、參考

彙編語言-王爽編程

2、正文

能夠修改IP,或者同時修改CS和IP的指令統稱爲轉移指令
轉移指令就是能夠控制CPU執行內存中某處代碼的指令模塊化

2.2 CALL和RET指令

call 和 ret指令都是轉移指令,都修改IP, 或者同時修改CS和IP,它們常常被共同用於實現子程序的設計。spa

2.2.1 ret和retf

ret指令用棧中的數據,修改IP的內容,實現近轉移;
retf指令用棧中的數據,修改CS和IP的內容,從而實現遠轉移;設計

CPU執行ret指令,至關於進行:
pop IPblog

實際變動爲:
(IP) = ( (ss)*16 + (sp) )
(sp) = (sp) + 2內存

CPU執行retf指令,至關於進行:
pop IP
pop CSget

實際變動爲:it

(IP) = ( (ss)*16 + (sp) )
(sp) = (sp) + 2
(CS) = ( (ss)*16 + (sp) )
(sp) = (sp) + 2程序設計

2.2.2 call

CPU執行call指令時候,進行兩步操做:
(1)將當前的IP或者CS和IP壓入棧中;
(2)轉移class

call指令不能實現短轉移

2.2.3 call和ret配合使用

2.3 模塊化程序設計

call和ret指令共同支持了彙編語言編程中的模塊化設計,在實際的編程中,程序的模塊化必不可少,
由於現實問題比較複雜,對現實問題進行分析,須要將其轉化成爲相互聯繫、不一樣層次的子問題,這是必須解決的方式,利用call和ret指令,能夠用簡潔的方法,實現多個相互聯繫、功能獨立的子程序,用於解決一個複雜的問題。

2.3.2 寄存器衝突

子程序中使用的寄存器,極可能在主程序中也要使用,形成了寄存器使用上的衝突

如何避免這種衝突呢?可能存在如下兩個方案:
(1)在編寫子程序的程序時候,注意查看子程序中有沒有用到會產生衝突的寄存器,若是有,調用者使用別的寄存器;
(2)在編寫子程序時候,不要使用會產生衝突的寄存器

分析兩個方案的可行性:
(1)這將給調用子程序的程序的編寫形成很大的麻煩,由於必需要當心檢查子程序中是否有將產生衝突的寄存器,例如:若是子程序中使用了寄存器bx和cx,則主程序(調用者)不能使用bx, cx寄存器
(2)該方案不能實現,由於編寫子程序的時候,沒法知道未來的調用狀況

上面的設想都不可行,咱們但願:
(1)編寫調用子程序的程序的時候,沒必要關心子程序到底使用了哪些寄存器;
(2)編寫子程序的時候,沒必要關心調用者使用了哪些寄存器;
(3)不會發生寄存器衝突

解決問題的簡潔方法是:在子程序開始將子程序中全部用到的寄存器的內容都保存起來,在子程序返回前再恢復,可使用棧來保存寄存器中的內容

image.png

相關文章
相關標籤/搜索