汇编 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 equalZF=1if (i == j);if (i == 0);
JNZ/JNE若不为0则跳转;若不相等则跳转jump if not zero;jump if not equalZF=0if (i != j);if (i != 0);
JS若为负则跳转jump if signSF=1if (i < 0);
JNS若为正则跳转jump if not signSF=0if (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 overflowOF=1(null)
JNO若无溢出则跳转jump if not overflowOF=0(null)
JC/JB/JNAE若进位则跳转;若低于则跳转;若不高于等于则跳转jump if carry;jump if below;jump if not above equalCF=1if (i < j);
JNC/JNB/JAE若无进位则跳转;若不低于则跳转;若高于等于则跳转;jump if not carry;jump if not below;jump if above equalCF=0if (i >= j);
JBE/JNA若低于等于则跳转;若不高于则跳转jump if below equal;jump if not aboveZF=1或CF=1if (i <= j);
JNBE/JA若不低于等于则跳转;若高于则跳转jump if not below equal;jump if aboveZF=0或CF=0if (i > j);
JL/JNGE若小于则跳转;若不大于等于则跳转jump if less;jump if not greater equalSF != OFif (si < sj);
JNL/JGE若不小于则跳转;若大于等于则跳转;jump if not less;jump if greater equalSF = OFif (si >= sj);
JLE/JNG若小于等于则跳转;若不大于则跳转jump if less equal;jump if not greaterZF != OF 或 ZF=1if (si <= sj);
JNLE/JG若不小于等于则跳转;若大于则跳转jump if not less equal;jump if greaterSF=0F 且 ZF=0if(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指令表与笔记的文章就介绍到这了,希望大家以后多多支持。

以上是 汇编 JCC指令表与笔记 的全部内容, 来源链接: utcz.com/z/332400.html

回到顶部