1. ret指令
ret指令用栈顶中的数据,修改IP的内容,从而实现近转移。执行ret指令的基本步骤原理如下:
(1)(IP) = ((ss)*16 + (sp))
(2)(sp) = (sp) + 2
所以,CPU执行ret指令时,相当于执行:pop IP
IP(Instruction Pointer)是指令指针寄存器
ss(stack segment)是栈段寄存器
sp(stack pointer)是栈指针寄存器
下面的程序,ret指令执行后,(IP) = 0,CS:IP指向代码段的第一条指令
assume cs:code, ss:stack
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 ;栈顶数据为0
ret ;相当于执行:pop IP指令,所以ret指令执行后,(IP) = 0
code ends
end start
2. retf指令
retf指令同时用栈顶中的数据,修改IP和CS,从而实现远转移。执行retf指令的基本步骤原理如下:
(1)(IP) = ((ss)*16 + (sp))
(2)(sp) = (sp) + 2
(3)(CS) = ((ss)*16 + (sp))
(4)(sp) = (sp) + 2
所以,CPU执行ret指令时,相当于执行:
(1)pop IP
(2)pop CS
CS(Code Segment)是代码段寄存器
下面的程序,retf指令执行后,(IP) = 0, CS:IP指向代码段的第一条指令
assume cs:code, ss:stack
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
push cs
mov ax, 0
push ax
retf ;相当于执行:(1)pop IP; (2)pop CS, 所以retf指令执行后,CS:IP指向了代码段的第一条指令
code ends
end start
参考文献
《汇编语言(第4版)》- 王爽