【第十章】CALL和RET指令

call指令和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常共同用来实现子程序的设计。这一张,我们讲解call和ret指令的原理

10.1 ret和retf

ret(return)指令用栈中的数据,修改IP的内容,从而实现近转移;

retf(return far)指令用栈中的数据,修改CS和IP的内容,从而实现远转移

CPU执行ret指令时进行的操作:(相当于pop IP)

  1. (IP)=((ss)*16+(sp))
  2. (sp)=(sp)+2

CPU执行retf指令时,进行下面4步操作:(相当于pop IP然后popCS)

  1. (IP)=((ss)*16+(sp))
  2. (sp)=(sp)+2
  3. (CS)=((ss)*16+(sp))
  4. (sp)=(sp)+2

下面程序执行后,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 cs
				push ax
				retf
code ends

10.2 call指令

CPU执行call指令时,进行两步操作:

  1. 将当前的IP或CS和IP压入栈中
  2. 转移