标志寄存器

标志寄存器
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变为177A512FC      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,不能说是负数吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值