控制转移指令
跳转指令分为3大类指令:
一、无条件跳转: JMP;
二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);
三、根据 EFLAGS 寄存器的标志位跳转
1.无条件转移指令
JMP跳转指令
1) 短转移
格式:JMP SHORT value ;
跳转范围:-128--127
2) 近转移
格式:JMP NEAR PTR value
跳转范围:同一个段内-32768至32767
3)段间(远)转移
格式:JMP FAR PTR value
2.条件转移
JE ;等于则跳转
JNE ;不等于则跳转
JZ ;为 0 则跳转
JNZ ;不为 0 则跳转
JS ;为负则跳转
JNS ;不为负则跳转
JC ;进位则跳转
JNC ;不进位则跳转
JO ;溢出则跳转
JNO ;不溢出则跳转
JA ;无符号大于则跳转,A:above, 无符号
JNA ;无符号不大于则跳转
JAE ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转
JG ;有符号大于则跳转,G:great,有符号
JNG ;有符号不大于则跳转
JGE ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转
JB ;无符号小于则跳转,B:below,无符号小于
JNB ;无符号不小于则跳转
JBE ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转
JL ;有符号小于则跳转,L:less,有符号小于
JNL ;有符号不小于则跳转
JLE ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转
JP ;奇偶位置位则跳转
JNP ;奇偶位清除则跳转
JPE ;奇偶位相等则跳转
JPO ;奇偶位不等则跳转
LOOP 循环指令
格式:
测试条件:(CX)!=0
LOOPZ/LOOPE 当为零或相等时循环指令
格式:
LOOPZ(或LOOPE)
OPR
测试条件:(CX)==0且ZF==1
LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式:
LOOPNZ(或LOOPNE) OPR
测试条件:(CX)!=0且ZF==0
//计算2^n需要n-1条重复的指令add ax, ax
//2^index
unsigned int power_2(unsigned int index)
{
__asm{
mov eax,2
mov edx,index
sub edx,1
mov ecx,edx;
s:
add eax,eax
loop s
}
}
子程序调用指令:
CALL调用指令(段内,段间,涉及到CS和IP入栈)
Call eax
RET返回指令
RETN/RETF在汇编代码中的形式如下:
RETN
RETN
N
RETF
RETF
N
其中retn中的n意即near,retf中的f意即far。
RETN等价于一条指令:
POP eip
RETF等价于两条指令:
POP
eip
POP
CS
而带有操作数N的RETN/RETF指令则是在POP之后,执行ESP=ESP+N。比如:
RETF 8等价于:
pop eip
pop cs
add esp, 8
RET 既有可能是retn,也有可能是retf。
中断指令:
INT指令
格式: INT TYPE
比如:
int 3//断点指令
int 21h等
或 INT
iret