組合語言 call和ret指令

2022-05-07 12:15:11 字數 1922 閱讀 2882

call和ret指令都是轉移指令,它們都修改ip,或同時修改cs和ip。它們經常被共同用來實現子程式的設計。

ret指令用棧中的資料,修改ip的內容,從而實現近轉移;

retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移;

cpu執行ret指令時,進行下面兩步操作:

cpu執行retf指令時,進行下面4步操作:

可以看出,如果我們用彙編語法來解釋ret和retf指令,則:

cpu執行ret指令時,相當於執行:

pop ip
cpu執行retf指令時,相當於執行:

pop ip

pop cs

call 標號(將當前的ip壓入棧後,轉到目標處執行指令)

cpu執行此種格式的call指令時,進行如下的操作:

(sp)=(sp)-2

((ss)*16+(sp))=(ip)

(ip)=(ip)+16位位移。

cpu執行 call 標號 時,相當於進行:

push ip

jmp near ptr 標號

call far ptr 標號 實現的是段間轉移。

cpu執行此種格式的call指令時,進行如下的操作。

cpu執行 call far ptr 標號 時,相當於進行:

push cs

push ip

jmp far ptr 標號

指令格式:call 16 位 reg

功能:cpu執行 call far ptr 標號 時,相當於進行:

push ip

jmp 16位 reg

轉移位址在記憶體中的call指令有兩種格式。

call word ptr 記憶體單元位址

push ip

jmp word ptr 記憶體單元位址

call dword ptr 記憶體單元位址

push cs

push ip

jmp dword ptr 記憶體單元位址

mul 是乘法指令,使用mul 做乘法的時候注意以下兩點:

我們利用call和ret來實現子程式的機制。子程式的框架如下。

標號:

指令 ret

具有子程式的源程式的框架如下。

assume cs:code

code segment

main:

: call sub1 ;呼叫子程式sub1

: :mov ax,4c00h

int 21h

sub1: ;子程式sub1開始

: call sub2 ;呼叫子程式sub2

: :ret ;子程式返回

sub2: ;子程式sub2開始

: ret ;子程式返回

code ends

end main

但可能引出乙個一般化的問題:子程式中使用的暫存器,很有可能在主程式中也要使用,造成了暫存器使用上的衝突。

解決這個問題的簡捷方法是,在子程式的開始將子程式中所有用到的及暫存器中的內容都儲存起來,在子程式返回前再恢復。可以用棧來儲存暫存器中的內容。

所以,我們編寫子程式的標準框架:

子程式開始:  子程式中使用的暫存器入棧

子程式的內容

子程式中使用的暫存器出棧

返回(ret,retf)

組合語言 CALL 和RET指令

call和ret指令都是轉移指令,它們都修改ip,但同時修改cs和ip。ret指令用棧中的資料,修改ip的內容,從而實現近轉移。retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移。cpu執行ret指令時,進行下面兩步操作 ip ss 16 sp sp sp 2 cpu執行retf指令時,...

組合語言之call和ret指令

ret指令用棧中的資料,修改ip的內容,從而實現近轉移 retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移 cpu在執行ret指令時,進行下面兩步操作 ip ss 16 sp sp sp 2使用組合語言表示就是 pop ipassume cs code stack segment db ...

《學習筆記》王爽組合語言 CALL和RET指令

call和ret都是轉移指令,他們都修改ip,或同時修改cs和ip。他們經常被共同用來實現子程式的設計。1.ret 和 retf ret指令用棧中的資料,修改ip的內容,從而實現近轉移。retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移。cpu執行ret指令的時候,進行下面兩步操作 1 ...