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
20assume 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
20assume 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指向代码段的第一条指令。