call和ret指令都是转移指令,它们都修改IP,或同时修改cs和IP。它们经常被共同用来实现子程序的设计一。这一章,我们讲解call和ret指令的原理。
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
可以看出,如果我们用汇编语法来解释ret和retf指令,则:
CPU执行ret指令时,相当于进行:
pop IP
CPU执行retf指令时,相当于进行:
pop ip pop cs
案例:
下面的程序中,ret指令执行后,(IP)=0} CS:IP指向代码段的第一条指令。
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
下面的程序中,retf指令执行后,CS:IP指向代码段的第一条指令
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