汇编指令

0x01 跳转指令

一般来说,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

0x02 CMP/TEST etc.

跳转指令中,根据相关标志位进行跳转。而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    ;如果设置了零标志就跳转

0x03 Assembly中的B/W/D

CMPS用于两个字符串的比较,有 CMPS/CMPSB/CMPSW/CMPSD 系列指令。在汇编中B/W/D有以下含义:

B:Byte/W:Word(2bytes)/D:Double Word(4bytes)


你可能感兴趣的:(汇编指令)