目录
ret和retf

ret指令用栈中的数据,修改IP的内容,从而实现进转移;
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;

CPU执行ret指令时,进行下面两步操作:
(1) (IP)=((ss)*16+(sp))
(2) (sp)=(sp)+2

CPU执行retf指令时,进行下面4部操作:
(1) (IP)=((ss)16+(sp))
(2) (sp)=(sp)+2
(3) (CS)=((ss)
16+(sp))
(4) (sp)=(sp)+2

可以看出,CPU执行ret指令时,相当于进行:
pop IP

CPU执行retf指令时,相当于进行:
pop IP
pop CS

例如:
1、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
assume cs:code

stack segment
db 16 dup (0)
stack ends

code segment
mov ax,4c00h
int 21h

start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push ax
mov bx,0
ret
code ends

end start

ret指令执行后CS:IP指向代码的第一条指令
2、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
assume cs;code

stack segment
db 16 dup (0)
stack ends

code segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push cs
push ax
mov bx,0
retf
code ends

end start

retf指令执行后,CS:IP指向代码段的第一条指令。

文章作者: nocbtm
文章链接: https://nocbtm.github.io/2018/09/12/ret和retf/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nocbtm's Blog
打赏
  • 微信
  • 支付宝