汇编JCC学习

1.JMP指令:修改EIP的值(只修改了EIP的值,寄存器以及堆栈都没有改变)

    mov eip,寄存器/立即数          简写为      JMP 寄存器/立即数

 

2.Call指令:(修改了EIP的值,[ESP-4],把返回地址的值(当前地址+指令所占字节)压栈)

    push 地址B

    mov eip,地址A/寄存器    简写为:CALL 地址A/寄存器

3.RET指令:(相当于pop eip)

    lea esp,[esp+4]

    mov eip,[esp-4]      简写为:RET

4.CMP指令: 格式:CMP R/M,R/M/IMM (只修改标志寄存器的值)(加入SF=1了,一定是因为第一个操作数比第二个操作数小了,因为相减位负数,最高位为1

  该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。
  只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1

    
MOV EAX,100
    MOV ECX,100
    CMP EAX,ECX        观察Z位


   
 MOV EAX,100
    MOV ECX,200
    
CMP EAX,ECX        观察S位


    CMP AX,WORD PTR DS:[405000]

    CMP AL,BYTE PTR DS:[405000]

    CMP EAX,DWORD PTR DS:[405000]

5.TEST指令: (判断某一个寄存器是否为空,TEST EAX,EAX

  指令格式:TEST R/M,R/M/IMM

  该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位.

  与的操作表项如下:

    1 and 1 = 1

    1 and 0 = 0

    0 and 1 = 0

    0 and 0 = 0

  常见用法:用这个指令,可以确定某寄存器是否等于0。

  TEST EAX,EAX 观察Z位

  但是如果EAX的二进制某些位为1的话,那么运算的结果就不为零。

 

6. JE(两个操作数相等), JZ 结果为零则跳转(相等时跳转) ZF=1


7. JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=0


8、 JS 结果为负则跳转 SF=1


9、 JNS 结果为非负则跳转 SF=0


10、 JP, JPE 结果(低8位)中1的个数为偶数则跳转 PF=1


11、 JNP, JPO 结果中1的个数为非偶数则跳转 PF=0


12、 JO 结果溢出了则跳转 OF=1


13、 JNO 结果没有溢出则跳转 OF=0


14、 JB, JNAE 小于则跳转 (无符号数) CF=1


15、 JNB, JAE 大于等于则跳转 (无符号数) CF=0


16、 JBE, JNA 小于等于则跳转 (无符号数) CF=1 or ZF=1


17、 JNBE, JA 大于则跳转(无符号数) CF=0 and ZF=0


18、 JL, JNGE 小于则跳转 (有符号数) SF≠ OF


19、 JNL, JGE 大于等于则跳转 (有符号数) SF=OF


20、 JLE, JNG 小于等于则跳转 (有符号数) ZF=1 or SF≠ OF


21、 JNLE, JG 大于则跳转(有符号数) ZF=0 and SF=OF



  有符号无符号的区别:

  CMP AL,CL
  JG 0x12345678
  JA 0x12345678

原文地址:https://www.cnblogs.com/heyhx/p/14181916.html