汇编 JCC指令表与笔记

    汇编-JCC

    之前可以修改EIP寄存器的指令
    JMP,CALL,RETN

    所有JCC指令的动作->根据标志寄存器修改EIP的值

    标志寄存器 EFLAGS

    CF(bit 0)[Carry flag] C位

    若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零

    这个标志通常用来指示无符号证书运算的溢出状态

    宽度溢出位。只要容器内放不下就会发生变化

    MOV AL,0xFE
    ADD AL,2 C => 1

    MOV AL,0x7F
    SBU AL,0xFF C => 1

    PF (bit 2) [parity flag] P位 奇偶校验位

    如果结果的最低有效字节 最后一个字节(least-significant byte)包含偶数个1位则该位置1,否则清零

    利用PF可进行奇偶校验检查

    需要传输1100 1110,数据中含5个1,所以其奇校验位位0,同时吧1100 1110传输给接收方,
    接收方收到数据后再一次计算奇偶性,1100 1110中仍然含有5个1,所以接收方计算出的奇偶验位还是0,与发送方一致,表示在此次传输过程中未发生错误。

    例子:

    MOV AL,0xCE

    AF (bit 4)[Auxiliary Carry Flag] 辅助进位标志器

    如果算术操作在结果的第三位发生进位或者借位则该标志置1,否则清零

    这个标志在BCD(binary-code decimal) 算术运算中被使用

    ZF(bit 5)[Zero Flag] 用的最多 划重点。。

    若结果为0则将其置1,反之清零。
    经常与CMP或者TEST等指令一起使用

    例1: 判断2个值是否相等

    MOV EAX,100
    MOV ECX,100
    CMP EAX,ECX

    (CMP指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中 只影响标志寄存器)

    例2:判断某个值是否为0

    AND EAX,EAX 0 ZF=1

    TEST EAX,EAX

    (TEST相当于and,但是与运算的结果并不保存到第一个操作数中 只影响标志寄存器)

    SF(bit 7) [Sign Flag]

    该标志被设置为有符号整型的最高有效位
    (0指示结果为正,反之则为负)
    意思其实就是,运算完之后看下符号位 是0(正)还是1(负)

    当然如果是无符号数运算就不用看了

    只看容器内数字的最高位

    例子

    MOV AL,0x7F MOV AL,0xFE
    ADD AL,2 ADD AL,2

    OF(bit 11)[OverFlow Flag]

    溢出标志OF用于反应有符号数加减运算所得结果是否溢出
    可以这样理解:
    * 如果是无符号数运算,是否溢出看CF位
    * 如果是有符号数运算,是否溢出看OF位
    两个数做运算,运算完毕的结果跟运算前的数的最高位相同 OF为0
    最高位不同 为1

    例子:

    MOV AL,0x7F
    ADD AL,2

    DF(bit 10)[Diretion Flag]

    这个方向标志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。设置DF标志是的串指令自动递减(从高地址向低地址方向处理字符串),清楚该标志则是的串指令自动递增

    STD以及CLD指令分别用户设置以及清除DF标志

    JCC常见指令

    有符号和无符号的区别:

    CMP AL,CL
    JG 0x12345678
    JA 0x12345678

    汇编 JCC指令表

    JCC指条件跳转指令,CC就是指条件码。

    JCC指令 中文含义 英文原意 检查符号位 典型C应用
    JZ/JE 若为0则跳转;若相等则跳转 jump if zero;jump if equal ZF=1 if (i == j);if (i == 0);
    JNZ/JNE 若不为0则跳转;若不相等则跳转 jump if not zero;jump if not equal ZF=0 if (i != j);if (i != 0);
    JS 若为负则跳转 jump if sign SF=1 if (i < 0);
    JNS 若为正则跳转 jump if not sign SF=0 if (i > 0);
    JP/JPE 若1出现次数为偶数则跳转 jump if Parity (Even) PF=1 (null)
    JNP/JPO 若1出现次数为奇数则跳转 jump if not parity (odd) PF=0 (null)
    JO 若溢出则跳转 jump if overflow OF=1 (null)
    JNO 若无溢出则跳转 jump if not overflow OF=0 (null)
    JC/JB/JNAE 若进位则跳转;若低于则跳转;若不高于等于则跳转 jump if carry;jump if below;jump if not above equal CF=1 if (i < j);
    JNC/JNB/JAE 若无进位则跳转;若不低于则跳转;若高于等于则跳转; jump if not carry;jump if not below;jump if above equal CF=0 if (i >= j);
    JBE/JNA 若低于等于则跳转;若不高于则跳转 jump if below equal;jump if not above ZF=1或CF=1 if (i <= j);
    JNBE/JA 若不低于等于则跳转;若高于则跳转 jump if not below equal;jump if above ZF=0或CF=0 if (i > j);
    JL/JNGE 若小于则跳转;若不大于等于则跳转 jump if less;jump if not greater equal SF != OF if (si < sj);
    JNL/JGE 若不小于则跳转;若大于等于则跳转; jump if not less;jump if greater equal SF = OF if (si >= sj);
    JLE/JNG 若小于等于则跳转;若不大于则跳转 jump if less equal;jump if not greater ZF != OF 或 ZF=1 if (si <= sj);
    JNLE/JG 若不小于等于则跳转;若大于则跳转 jump if not less equal;jump if greater SF=0F 且 ZF=0 if(si>sj)

    汇编JCC笔记

    1. JMP指令:

    唯一作用是无条件修改EIP的值,没有对栈和寄存器产生影响。

    JMP 寄存器/立即数
    本质是MOV EIP,寄存器/立即数,EIP只能由JMP指令修改

    2. CALL指令:

    第一个作用和JMP一样,MOV EIP,寄存器/立即数。
    第二个作用,把CALL指令的写一个指令地址push到栈顶(修改ESP)
    CALL指令还没执行,怎么知道下一行指令的地址?
    根据CALL指令占用的数据宽度,加偏移量去算,比如CALL这条指令,地址0X004183D7中数据为E8 21 00 00 00,有5个字节,下一行指令的地址就是地址偏移5

    3.RET

    本质是POP EIP
    RET指令通常和CALL成对出现,把CALL压栈的地址POP EIP,让程序回归原来的流程

    4. CMP指令:该指令是比较两个操作数是否相同

    指令格式:CMP R/M,R/M/IMM
    相当于SUB指令,但是只会用两个数相减来比较是否相同,相减的结果并不保存在第一个操作数中。
    只会根据相减的结果来改变标志位的,当两个操作数相等的时候,零标志位置为1.
    MOV EAX,100
    MOV ECX,100
    CMP EAX,ECX  //只相减比较,判断并修改零标志寄存器,不会把EAX修改为相减结果。
    CMP AX,WORD PTR DS:[405000]
    CMP AL,BYTE PTR DS:[405000]
    CMP EAX,DWORD PTR DS:[405000]

    4. TEST指令:

    指令格式:TEST R/M,R/M/IMM
    该指令和CMP有一定的相似性,两个数值进行与操作,结果也不保存,但是会改变相应标志位。
    与操作:1 and 1 =1;1 and 0 = 0; 0 and 1 = 0; 0 and 0 = 0
    常见用法:用这个指令,可以确定某寄存器是否等于0,如果EAX的二进制某些位为 1 的话,那么运算的结果就不为零。

    TEST EAX,EAX

    5.
    1. JE,JZ ——-jump if equal结果为零则跳转(相等时跳转)——-ZF = 1

    例:

    CMP EAX,ECX
    JZ 0x413f9

    1、  JE, JZ         ————-结果为零则跳转(相等时跳转)—————-ZF=1
    2、  JNE, JNZ   ————-结果不为零则跳转(不相等时跳转)—————-ZF=0
    3、  JS              ————-结果为负则跳转—————-SF=1
    4、  JNS           ————-结果为非负则跳转—————-SF=0
    5、  JP, JPE     ————-结果中1的个数为偶数则跳转—————-PF=1
    6、  JNP, JPO  ————-结果中1的个数为偶数则跳转—————-PF=0
    7、  JO            ————-结果溢出了则跳转—————-OF=1
    8、  JNO         ————-结果没有溢出则跳转—————-OF=0
    9、   JB, JNAE————-小于则跳转 (无符号数)—————-CF=1
    10、 JNB, JAE————-大于等于则跳转 (无符号数)—————-CF=0
    11、  JBE, JNA————-小于等于则跳转 (无符号数)—————-CF=1 or ZF=1
    12、 JNBE, JA————-大于则跳转(无符号数)—————-CF=0 and ZF=0
    13、 JL, JNGE————-小于则跳转 (有符号数)—————-SF≠ OF
    14、 JNL, JGE————-大于等于则跳转 (有符号数)—————-SF=OF
    15、 JLE, JNG————-小于等于则跳转 (有符号数)—————-ZF=1 or SF≠ OF
    16、 JNLE, JG————-大于则跳转(有符号数)—————-ZF=0 and SF=OF

    好了这篇关于汇编 JCC指令表与笔记的文章就介绍到这了,希望大家以后多多支持lingkb。