标志寄存器
Jcc决定了cpu怎么走,标志寄存器决定了jcc。
Cpza(0246)stdo
如果有两个不会的问题,先搞定一个,不会一起搞定两。
(1)进位标志位CF
(carry flag):如果运算结果的最高位产生了一个进位或借位,那么
研究位的时候要先确定数据宽度。
77A51314 B8 FFFF5555 mov eax,0x5555FFFF :eax == 0x5555FFFF
77A51319 83C0 01 add eax,0x1 :eax ==0x55560000 C位不变
77A5131C B0 FF mov al,0xFF :eax==0x555600FF
77A5131E 04 01 add al,0x1 : eax==0x55560000 C位改变。进的位到 c标志位里面了。注意eax的结果。
数据宽度是8位。
40 + 80 无进位
80 – 40 无借位(最高位借才算)
80-81 :借位。
1000 0000
- 1000 0001
1111 1111
有借位:结果是FF = -1, CF =1.
(2)p位:结果(最后1个字节8位)包含1的个数
77A51320 B0 03 mov al,0x3 0
77A51322 04 03 add al,0x3 1
77A51324 04 02 add al,0x2 0
(3)AF辅助标志
77A51326 B8 FFFFEE55 mov eax,0x55EEFFFF :eax ==0x55EEFFFF
77A5132B 83C0 02 add eax,0x2 :eax ==0x55EF0001----AF变为1
77A5132E 66:B8 FE5E mov ax,0x5EFE :ax ==0x5EFE
77A51332 66:83C0 02 add ax,0x2 :ax ==0x5F00 ,AF变为1,
77A512FC 66:B8 0308 mov ax,0x803
77A51300 66:83C0 01 add ax,0x1
803
0000 1000 0000 0011
0000 1000 0000 0100
注意:完了p位是0, 是看最低有效字节。
77A51304 66:83C0 01 add ax,0x1
此时,pf标志为变为1.
(4)ZF零标志位。
Xor:作用:
A:把eax 清零 B:影响标志位。
和mov eax,0的区别:不修改标志寄存器。
77A51336 33C0 xor eax,eax
(5)SF符号标志位:最高位是什么,就是什么。
77A51338 B0 7F mov al,0x7F al:0x7F
77A5133A 04 02 add al,0x2 al:0x81 ,sign :1.
(6)0F:溢出标志位
是无符号:只关注c位。
有符号运算:只关注o位
正 + 正 = 正 如果结果是负数,说明有溢出。
负 +负 = 负 如果结果是正数,说明有溢出
正 + 负 永远都不会溢出。
(1) 有符号、无符号都不溢出,数据宽度8位。
77A5133C B0 08 mov al,0x8
77A5133E 04 08 add al,0x8
当无符号计算:不超过FF,
当有符号计算:不超过7F。
(2) 无符号溢出(关注c),有符号不溢出
77A51340 B0 FF mov al,0xFF
77A51342 04 02 add al,0x2 :al:01,c:1.
(3) 无符号不溢出,有符号溢出(o位)
77A51344 B0 7F mov al,0x7F
77A51346 04 02 add al,0x2 :al== 81,c:0,o:1.
(4) 无符号,有符号都溢出
77A51348 B0 FE mov al,0xFE
77A5134A 04 80 add al,0x80
当成无符号:超过FF了。
当成有符号:两个加完成正数了。
注意:主要是你把它看成什么计算,计算机不管你。那个圆图很有用。
77A51308 B0 80 mov al,0x80
执行前:al ==00 ,c位==1 ;执行后 al ==80,c位 ==1。(未改变)
77A5130A 2C 40 sub al,0x40 al== 0x40 。
执行前:al ==80 ,c位==1 ;执行后 al ==40,c位 ==0。(改变为正确结果)
77A5130C B0 80 mov al,0x80
77A5130E 04 C0 add al,0xC0(add al,-40): al ==0x40 ,c位==1.
1000 0000(80)
1100 0000 (c0)
计算机判断OF位:(1+1)
符号位有进位:1(1+1)
最高有效数值位想符号产生的进位:0(1+0)。
1 xor 0 == 1,所以OF=1.
C语言定义变量你要指明是有符号还是无符号的:默认是有符号的。
例如:Sf是1,不能说是负数吧。