ret和call的原理

2021-06-21 21:26:18 字數 1198 閱讀 2226

1.ret

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

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

(1)(ip)=((ss)*16+(sp))  //使用棧頂元素修改ip實現跳轉

(2)(sp)=(sp)+2

2.retf

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

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

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

(2)(sp)=(sp)+2

(3)(cs)=((ss)*16+(sp))

(4)(sp)=(sp)+2

發現retf依次彈出棧的2個元素來修改ip和cs

可以看出,如果我們用組合語言來解釋ret和retf指令,則cpu執行ret指令時,相當於進行:

pop ip

cpu執行retf指令時,相當於進行

pop ip

pop cs

3 call指令

cpu執行call指令時,進行兩步操作:

(1)將當前的ip或cs和ip壓入棧中

(2)轉移

call指令不能實現短轉移,除此之外,call指令實現轉移的方法和jmp指令的原理相同

4,根據位移進行轉移的call指令

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

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

(1)(sp)=(sp)-2 

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

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

從上面的描述總,可以看出,如果我們用彙編語法來解釋此格式的call指令,則:

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

push ip

jmp near ptr 標號

4 call far ptr標號實現段間轉移

相當於:

push cs

push ip

jmp far ptr 標號

5.轉移位址在暫存器中的call指令

格式:call 16位暫存器

相當於:

push ip

jmp 16位暫存器

push ip

jmp word ptr 記憶體單元位址

push cs

push ip

jmp dword ptr 記憶體位址

編譯原理 CALL和RET指令(二)

call指令和ret指令的用法 call和ret指令 一 可以利用call和ret來實現子程式的機制,框架為 標號 指令 ret具有子程式的程式框架如下 assume cs code code segment main call sub1 mov ax,4c00h int 21h sub1 call...

組合語言 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指令

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