彙編語言-王爽編程
能夠修改IP,或者同時修改CS和IP的指令統稱爲轉移指令
轉移指令就是能夠控制CPU執行內存中某處代碼的指令模塊化
call 和 ret指令都是轉移指令,都修改IP, 或者同時修改CS和IP,它們常常被共同用於實現子程序的設計。spa
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程序設計
CPU執行call指令時候,進行兩步操做:
(1)將當前的IP或者CS和IP壓入棧中;
(2)轉移class
call指令不能實現短轉移
call和ret指令共同支持了彙編語言編程中的模塊化設計,在實際的編程中,程序的模塊化必不可少,
由於現實問題比較複雜,對現實問題進行分析,須要將其轉化成爲相互聯繫、不一樣層次的子問題,這是必須解決的方式,利用call和ret指令,能夠用簡潔的方法,實現多個相互聯繫、功能獨立的子程序,用於解決一個複雜的問題。
子程序中使用的寄存器,極可能在主程序中也要使用,形成了寄存器使用上的衝突
如何避免這種衝突呢?可能存在如下兩個方案:
(1)在編寫子程序的程序時候,注意查看子程序中有沒有用到會產生衝突的寄存器,若是有,調用者使用別的寄存器;
(2)在編寫子程序時候,不要使用會產生衝突的寄存器
分析兩個方案的可行性:
(1)這將給調用子程序的程序的編寫形成很大的麻煩,由於必需要當心檢查子程序中是否有將產生衝突的寄存器,例如:若是子程序中使用了寄存器bx和cx,則主程序(調用者)不能使用bx, cx寄存器
(2)該方案不能實現,由於編寫子程序的時候,沒法知道未來的調用狀況
上面的設想都不可行,咱們但願:
(1)編寫調用子程序的程序的時候,沒必要關心子程序到底使用了哪些寄存器;
(2)編寫子程序的時候,沒必要關心調用者使用了哪些寄存器;
(3)不會發生寄存器衝突
解決問題的簡潔方法是:在子程序開始將子程序中全部用到的寄存器的內容都保存起來,在子程序返回前再恢復,可使用棧來保存寄存器中的內容