时间:2021-05-19
汇编-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指令表与笔记的文章就介绍到这了,希望大家以后多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由CPU加载和执行。一条指令有四个组成部分:
指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由CPU加载和执行。一条指令有四个组成部分:
以计算机为例,一条指令通常由操作码和操作数组成。指令是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由CPU加载和执行。
指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。控制器靠指令指挥机器工作,人们用指令表达自己的意图,并
汇编语言是一种工具程序设计语言,用于将汇编语言源程序转换为机器语言。 在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbo