汇编-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 => 1mov 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指令表与笔记的文章就介绍到这了,