C语言if和汇编jcc程序对比,汇编 JCC指令表与笔记

汇编-JCC

之前可以修改EIP寄存器的指令

JMP,CALL,RETN

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

标志寄存器 EFLAGS

997f4cc3ac99cd0ef8fc5389e3316274.png

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常见指令

f9e7f5c108f0fd2c6044810b776e2ff5.png

有符号和无符号的区别:

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指令表与笔记的文章就介绍到这了,希望大家以后多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值