1、转移指令
修改ip或修改ip和cs的指令。
jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
等几种汇编指令,它们对IP的修改是根据转移目的地址和转移起始地址之间的位移来进行。
2、堆栈操作
PUSH SRC: SP的值减2,然后把源操作数SRC送入由SP所指的栈顶
POP DST: 先把SP所指的字数据送至目的操作数DST,然后SP值加2
3、call、ret
ret: (IP)=((SS)*16 + (SP)), (SP)=(SP)+2,相当于pop IP
retf: (IP)=((SS)*16 + (SP)), (SP)=(SP)+2, (CS)=((SS)*16 + (SP)), (SP)=(SP)+2,相当于pop IP, pop CS
call: 将当前的IP或CS和IP压入栈中;转移
(1) 根据位移进行转移的call指令
格式:call 标号
操作:sp=sp-2, ss*16+sp=ip, ip=ip+16位位移
相当于:push ip, jmp near ptr标号
(2) 转移的目标地址在指令中的call指令
格式:call far ptr 标号
相当于:push cs, push ip, jmp far ptr标号
4、call和ret的配合使用
子程序的实现机制
stack segment
db 8 dup( 0) 1000: 0000 00 00 00 00 00 00 00 00
db 8 dup( 0) 1000: 0008 00 00 00 00 00 00 00 00
stack ends
code segment
start: mov ax,stack 1001: 0000 B8 00 10
mov ss,ax 1001: 0003 8E D0
mov sp, 16 1001: 0005 BC 10 00
mov ax, 1000 1001: 0008 B8 E8 03
call s 1001: 000B E8 05 00 ; 机器码中的00 05是标号相对于call的下一条指令的偏移量
mov ax,4c00h 1001: 000E B8 00 4C
int 21h 1001: 0011 CD 21
s: add ax,ax 1001: 0013 03 C0
ret 1001: 0015 C3
code ends
end start
该程序的主要执行过程:
(1) 前三条指令执行后,栈的情况如下:
1000:0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
↑
ss:sp
(2) call指令读入后,ip=000EH,CPU指令缓冲器中的代码为:E8 05 00
CPU执行E8 05 00,首先,栈中的情况变为:
1000:0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00
↑
ss:sp
然后,ip=ip+0005=0013H
(3) CPU从cs:0013H处(即标号s处)开始执行。
(4) ret指令读入后:
ip=0016H,CPU指令缓冲器中的代码为:C3
CPU执行C3,相当于进行pop IP,执行后,栈中的情况为:
1000:0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00
↑
ss:sp
ip=000EH
(5) CPU回到cs:000EH处(即call指令后面的指令处)继续执行。