标签:
一般来说,x86中有两种跳转指令:
1.算术跳转,像 JZ (jump if zero), JC (jump if carry), JNC (jump if not carry)等
2.比较跳转:像JE (jump if equal), JB (jump if below), JAE (jump if above or equal)等
第一类跳转应用在算术或逻辑指令之后,例如:
sub eax, ebx jnz .result_is_not_zero and ecx, edx jz .the_bit_is_not_set
第二类跳转应用在CMP指令后,例如:
cmp eax, ebx jne .eax_is_not_equal_to_ebx cmp ecx, edx ja .ecx_is_above_than_edx
需要注意一点是,这些指令有时是一样的,如JZ == JE; JC == JB; JNC == JAE等等。下面就是详细的表格,只有16类条件跳转指令,但却有30条指令。这样一来相互替换可以增强Assembly程序的可读性。
Mnemonic Condition tested Description
jo OF = 1 overflow
jno OF = 0 not overflow
jc, jb, jnae CF = 1 carry / below / not above nor equal
jnc, jae, jnb CF = 0 not carry / above or equal / not below
je, jz ZF = 1 equal / zero
jne, jnz ZF = 0 not equal / not zero
jbe, jna CF or ZF = 1 below or equal / not above
ja, jnbe CF or ZF = 0 above / not below or equal
js SF = 1 sign
jns SF = 0 not sign
jp, jpe PF = 1 parity / parity even
jnp, jpo PF = 0 not parity / parity odd
jl, jnge SF xor OF = 1 less / not greater nor equal
jge, jnl SF xor OF = 0 greater or equal / not less
jle, jng (SF xor OF) or ZF = 1 less or equal / not greater
jg, jnle (SF xor OF) or ZF = 0 greater / not less nor equal
跳转指令中,根据相关标志位进行跳转。而CMP/TEST等指令影响PSW寄存器相关标志位,PSW寄存器即状态寄存器。
PSW寄存器图:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
OF(Overflow Flag)溢出标志,溢出时为1,否则置0.
SF(Sign Flag)符号标志,结果为负时置1,否则置0.
ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.
CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.
AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0.
PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.
DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
IF(Interrupt Flag)中断标志。
TF(Trap Flag)陷阱标志。
++++++++++++++++ TEST属于逻辑运算指令 ++++++++++++++++
功能: 执行bit与bit之间的逻辑运算
语法: TEST r/m,r/m/data
影响标志位: C,O,P,Z,S(其中C与O两个标志会被设为0)
举例:
1.TEST 用来测试一个位,例如寄存器:
test eax, 100b jnz short loc_401168 ;如果eax右数第三个位为1,jnz将会跳转
2.TEST 用来测试寄存器是否为空:
test ecx, ecx jz short loc_401334
如果ecx为零,设置ZF零标志为1,jz跳转
++++++++++++++++ CMP属于算术运算指令 ++++++++++++++++
功能: 比较两个值(寄存器,内存,直接数值)
语法: CMP r/m,r/m/data
影响标志位: C,P,A,Z,O
cmp实际上是只设置标志不保存结果的减法
举例:
cmp eax, 2 ;如果eax-2=0即eax=2就设置零标志为1 jz short loc_401334 ;如果设置了零标志就跳转
CMPS用于两个字符串的比较,有 CMPS/CMPSB/CMPSW/CMPSD 系列指令。在汇编中B/W/D有以下含义:
B:Byte/W:Word(2bytes)/D:Double Word(4bytes)
标签:
原文地址:http://my.oschina.net/cve2015/blog/514426