汇编 JCC指令表与笔记
汇编-JCC
之前可以修改EIP寄存器的指令
JMP,CALL,RETN
所有JCC指令的动作->根据标志寄存器修改EIP的值
标志寄存器EFLAGS
CF(bit0)[Carryflag]C位
若算术产生的结果在最高有效位(most-significantbit)发生进位或者借位则将其置1反之清零
这个标志通常用来指示无符号证书运算的溢出状态
宽度溢出位。只要容器内放不下就会发生变化
MOVAL,0xFE
ADDAL,2C=>1MOVAL,0x7F
SBUAL,0xFFC=>1
PF(bit2)[parityflag]P位奇偶校验位
如果结果的最低有效字节最后一个字节(least-significantbyte)包含偶数个1位则该位置1,否则清零
利用PF可进行奇偶校验检查
需要传输11001110,数据中含5个1,所以其奇校验位位0,同时吧11001110传输给接收方,
接收方收到数据后再一次计算奇偶性,11001110中仍然含有5个1,所以接收方计算出的奇偶验位还是0,与发送方一致,表示在此次传输过程中未发生错误。
例子:
MOVAL,0xCE
AF(bit4)[AuxiliaryCarryFlag]辅助进位标志器
如果算术操作在结果的第三位发生进位或者借位则该标志置1,否则清零
这个标志在BCD(binary-codedecimal)算术运算中被使用
ZF(bit5)[ZeroFlag]用的最多划重点。。
若结果为0则将其置1,反之清零。
经常与CMP或者TEST等指令一起使用
例1:判断2个值是否相等
MOVEAX,100
MOVECX,100
CMPEAX,ECX
(CMP指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中只影响标志寄存器)
例2:判断某个值是否为0
ANDEAX,EAX0ZF=1
TESTEAX,EAX
(TEST相当于and,但是与运算的结果并不保存到第一个操作数中只影响标志寄存器)
SF(bit7)[SignFlag]
该标志被设置为有符号整型的最高有效位
(0指示结果为正,反之则为负)
意思其实就是,运算完之后看下符号位是0(正)还是1(负)
当然如果是无符号数运算就不用看了
只看容器内数字的最高位
例子
MOVAL,0x7FMOVAL,0xFE
ADDAL,2ADDAL,2
OF(bit11)[OverFlowFlag]
溢出标志OF用于反应有符号数加减运算所得结果是否溢出
可以这样理解:
*如果是无符号数运算,是否溢出看CF位
*如果是有符号数运算,是否溢出看OF位
两个数做运算,运算完毕的结果跟运算前的数的最高位相同OF为0
最高位不同为1
例子:
MOVAL,0x7F
ADDAL,2
DF(bit10)[DiretionFlag]
这个方向标志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。设置DF标志是的串指令自动递减(从高地址向低地址方向处理字符串),清楚该标志则是的串指令自动递增
STD以及CLD指令分别用户设置以及清除DF标志
JCC常见指令
有符号和无符号的区别:
CMPAL,CL
JG0x12345678
JA0x12345678
汇编JCC指令表
JCC指条件跳转指令,CC就是指条件码。
JCC指令 | 中文含义 | 英文原意 | 检查符号位 | 典型C应用 |
---|---|---|---|---|
JZ/JE | 若为0则跳转;若相等则跳转 | jumpifzero;jumpifequal | ZF=1 | if(i==j);if(i==0); |
JNZ/JNE | 若不为0则跳转;若不相等则跳转 | jumpifnotzero;jumpifnotequal | ZF=0 | if(i!=j);if(i!=0); |
JS | 若为负则跳转 | jumpifsign | SF=1 | if(i<0); |
JNS | 若为正则跳转 | jumpifnotsign | SF=0 | if(i>0); |
JP/JPE | 若1出现次数为偶数则跳转 | jumpifParity(Even) | PF=1 | (null) |
JNP/JPO | 若1出现次数为奇数则跳转 | jumpifnotparity(odd) | PF=0 | (null) |
JO | 若溢出则跳转 | jumpifoverflow | OF=1 | (null) |
JNO | 若无溢出则跳转 | jumpifnotoverflow | OF=0 | (null) |
JC/JB/JNAE | 若进位则跳转;若低于则跳转;若不高于等于则跳转 | jumpifcarry;jumpifbelow;jumpifnotaboveequal | CF=1 | if(i |
JNC/JNB/JAE | 若无进位则跳转;若不低于则跳转;若高于等于则跳转; | jumpifnotcarry;jumpifnotbelow;jumpifaboveequal | CF=0 | if(i>=j); |
JBE/JNA | 若低于等于则跳转;若不高于则跳转 | jumpifbelowequal;jumpifnotabove | ZF=1或CF=1 | if(i<=j); |
JNBE/JA | 若不低于等于则跳转;若高于则跳转 | jumpifnotbelowequal;jumpifabove | ZF=0或CF=0 | if(i>j); |
JL/JNGE | 若小于则跳转;若不大于等于则跳转 | jumpifless;jumpifnotgreaterequal | SF!=OF | if(si |
JNL/JGE | 若不小于则跳转;若大于等于则跳转; | jumpifnotless;jumpifgreaterequal | SF=OF | if(si>=sj); |
JLE/JNG | 若小于等于则跳转;若不大于则跳转 | jumpiflessequal;jumpifnotgreater | ZF!=OF或ZF=1 | if(si<=sj); |
JNLE/JG | 若不小于等于则跳转;若大于则跳转 | jumpifnotlessequal;jumpifgreater | SF=0F且ZF=0 | if(si>sj) |
汇编JCC笔记
1.JMP指令:
唯一作用是无条件修改EIP的值,没有对栈和寄存器产生影响。
JMP寄存器/立即数
本质是MOVEIP,寄存器/立即数,EIP只能由JMP指令修改
2.CALL指令:
第一个作用和JMP一样,MOVEIP,寄存器/立即数。
第二个作用,把CALL指令的写一个指令地址push到栈顶(修改ESP)
CALL指令还没执行,怎么知道下一行指令的地址?
根据CALL指令占用的数据宽度,加偏移量去算,比如CALL这条指令,地址0X004183D7中数据为E821000000,有5个字节,下一行指令的地址就是地址偏移5
3.RET
本质是POPEIP
RET指令通常和CALL成对出现,把CALL压栈的地址POPEIP,让程序回归原来的流程
4.CMP指令:该指令是比较两个操作数是否相同
指令格式:CMPR/M,R/M/IMM
相当于SUB指令,但是只会用两个数相减来比较是否相同,相减的结果并不保存在第一个操作数中。
只会根据相减的结果来改变标志位的,当两个操作数相等的时候,零标志位置为1.
MOVEAX,100
MOVECX,100
CMPEAX,ECX //只相减比较,判断并修改零标志寄存器,不会把EAX修改为相减结果。
CMPAX,WORDPTRDS:[405000]
CMPAL,BYTEPTRDS:[405000]
CMPEAX,DWORDPTRDS:[405000]
4.TEST指令:
指令格式:TESTR/M,R/M/IMM
该指令和CMP有一定的相似性,两个数值进行与操作,结果也不保存,但是会改变相应标志位。
与操作:1and1=1;1and0=0;0and1=0;0and0=0
常见用法:用这个指令,可以确定某寄存器是否等于0,如果EAX的二进制某些位为1的话,那么运算的结果就不为零。
TESTEAX,EAX
5.
1.JE,JZ-------jumpifequal结果为零则跳转(相等时跳转)-------ZF=1
例:
CMPEAX,ECX
JZ0x413f9
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=1orZF=1
12、JNBE,JA-------------大于则跳转(无符号数)----------------CF=0andZF=0
13、JL,JNGE-------------小于则跳转(有符号数)----------------SF≠OF
14、JNL,JGE-------------大于等于则跳转(有符号数)----------------SF=OF
15、JLE,JNG-------------小于等于则跳转(有符号数)----------------ZF=1orSF≠OF
16、JNLE,JG-------------大于则跳转(有符号数)----------------ZF=0andSF=OF
好了这篇关于汇编JCC指令表与笔记的文章就介绍到这了,希望大家以后多多支持毛票票。