操作系統製作(4)jmp ret iret retf call詳解

一、子程序的調用CALL
彙編語言中子程序的調用採用call指令,該指令的基本格式如下:
call <子程序名>

調用過程分兩種情況:
(1)call near <子程序名>
當調用指令和子程序處在同一代碼段時。該調用指令的執行過程是: 首先將call指令的下一條指令地址(16位的EA)壓入堆棧。

SP減2;
IP值放到((SP + 1), (SP))中;

再將子程序所在的地址(EA)送到IP,程序將轉入子程序執行。這種調用稱爲段內調用。
在這裏插入圖片描述
(2)call far <子程序名>
當調用指令和子程序不在同一代碼段,即子程序爲FAR屬性時,該調用指令的執行過程爲: 首先將call指令的下一條指令地址的16位的段地址和16位的EA先後壓入堆棧。

SP減2;CS放到((SP + 1), (SP))中;
SP再減2;IP值放到((SP + 1), (SP))中;

再將子程序所在的段地址與偏移地址分別送到代碼段寄存器CS和程序指針寄存器IP中。即:
子程序的偏移地址->(IP);子程序的段地址->(CS)。程序將轉入子程序執行。這種調用稱爲段間調用。
子程序的入口地址可存放於寄存器或存儲器中,採用間接調用方式來實現。call指令不影響標誌位
在這裏插入圖片描述
二、子程序返回RET
子程序或過程執行到最後一條指令必須是RET指令,其功能是使程序的執行控制從子程序返回到調用指令CALL後的指令處即斷電繼續執行。RET指令的基本格式如下:
RET [<數字>]

子程序返回主程序也分幾種情況:
(1)近跳轉返回ret
如果RET所在的子程序屬性爲NEAR,該指令執行時,會從堆棧中彈出一個字的內容給指令指針寄存器IP。
((SP + 1), (SP))->(IP);(SP)+2->(SP)
(2)遠跳轉返回retf
如果RET所在的子程序屬性爲FAR,該指令執行時,會從堆棧中彈出兩個相鄰字的內容分別送到IP、CS。
((SP + 1), (SP))->(IP);(SP)+2->(SP)
((SP + 1), (SP))->(CS);(SP)+2->(SP)

RET指令從堆棧中彈回的內容應爲CALL指令壓入堆棧的內容,這樣才能保證調用時與返回後的一致性。這要求在子程序中PUSH指令與POP指令應當成對使用,否則可以在RET指令後面跟一個數字。

例如: RET4
相當於執行完一條不跟數值的RET指令之後,SP再加4。
(3)中斷返回iret

(4)retf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章