首页
社区
课程
招聘
[原创]我和CPU之间关于EFLAGS的对话
发表于: 2009-10-17 02:23 28657

[原创]我和CPU之间关于EFLAGS的对话

2009-10-17 02:23
28657

某日下午,偶为了学习《加密解密》正伏案研究汇编语言中涉及到的CPU EFLAGS相关内容.针对书本上的内容,整按照自己的理解写了几个测试程序,用OD调来调去,可是EFLAGS寄存器的变化和自己想的总是不一样。于是苦苦思索,百思不得其解,只好闭目养神。
    不知道过了多久,在半睡半醒中来到一处陌生的地方。正四处张望的时候,前方突然出现一特大号CPU,那CPU竟然还能开口说话。因此才有了下面这段谈话。
   “CPU兄,您好。小弟最近在研究您内部的EFLAGS寄存器,能请教您几个问题吗?”我赶紧上前打招呼。
    “哦,你是UKYOHY吧。我正等你呢。就是你刚才老拿一个叫啥OLLYDBG的程序不停的在查看我的EFLAGS的值啊。有啥问题你说吧。” CPU答到。
我赶紧将正在思考的问题说出:“您能给我说说您的EFLAGS的结构吗?就是每个标志位都代表什么?”
      CPU :“BS你哦,这个问题好多文档上不是都写了嘛。比如最权威的intel官方文档都有啊,只有你整部明白,不停的调试来调试去,弄的我一身汗。哎,看你可怜,我再说一遍吧。” 说完,CPU一招手,凭空出现了一块黑板。他没有理睬我吃惊的表情,转身在黑板上画了如下的图:


        CPU画完之后看了看黑板满意的点点头,然后回过头来对我说:“先声明哦,灰色部分不要问我,因为我也不知道是干什么用的,也许只有我的父母才知道。”
     我仔细看了看黑板上的图,越看越迷惑,因为我看的书上没有介绍这么多,只好继续问CPU: “哦,我看的书上只介绍了CF,PF,AF,ZF,SF,OF 六个标志位,即使除掉保留位,也还剩下好多啊,这么多标志位该怎么学习理解啊?“
      CPU:  “CF,PF,AF,ZF,SF,OF 是最常用的6个标志啦,你作为一个初学者,先学习这6个标志就可以了,其他的暂时可以忽略。我来考考你,这6个进位标志你是怎么理解的?”
       我: “哦,书上时这么说的: CF标志位是当无符号加法运算的结果太大(或太小),目的操作数无法容纳的时候,CF标志位将被设置为1;PF 标志当结果数为1的bit位总数为偶数时设置为1;AF 标志当操作导致bit3向bit4进位的时候设置为1;ZF标志当结果为0的时候设置为1;SF标志当结果为负时被设置;OF标志当有符号数太大无法容纳于目的操作数时被设置为1.”
       CPU:“在评价你的答案之前,你能否回答我一个问题?你在答案中提到了无符号和有符号数,那么我是怎么判断一个数时有符号还是无符号的呢?”
       “哦…….”,我想了一下,尝试的发问“根据补码?根据符号位?”
        然后用求助的目光看着CPU。
        CPU笑而不答。
       “好吧,好吧…..我承认我不知道,还是请您告诉我吧。”我鼓足勇气说到。
       “知之为知之,不知为不知是为知也。孺子可教啊”,CPU得意的说。
        在顿了顿之后,CPU接着说道:“其实这个问题的答案是,作为CPU的我根本不知道一个数字到底是无符号还是有符号。我只知道这是个数字,或者精确的说,我的眼里只有这个数字的二进制表示形式。其实,从这个方面来说,我的设计逻辑没有想象的那么复杂,甚至可以说有点傻,我只关心二进制的加减(这里暂时忽略乘除)。我说的这些你能理解么?”
       我:“哦,我想起来了,《intel汇编程序设计》4.2.6节曾经提到过这个问题。大意是说CPU不知道,只有程序员知道。哎,你刚才的问题我其实是可以回答的,都怪我看书太不仔细了。不过这个观点我不是很理解,你能详细解释下么?”
       CPU:“当然可以。以下的内容要仔细听好哦。以一个字节为例,如果你分别向AL寄存器传送 1和 -1. 那么指令执行之后,AL里面的值究竟是什么呢? 根据你刚才的回答,你应该知道,传送1之后,AL的值是0X1h。 传送 -1 ,AL的值是0XFFh
换句话说,1是直接转换成2进制存储到AL中。而-1是按照其补码存储到AL中的。可是这里的问题是,-1的补码是编译器在编译的时候完成转换的。换句话说,程序开始执行的时候,传到AL的实际值就是0xFFH. 在我眼里,它就是11111111,究竟它代表-1还是代表255,我也不知道。只有作为程序员的你知道。这点你能理解么?”
      CPU说道这里,停了下来,然后看着我。我仔细思考了下,似乎有点理解了,然后点了点头。      
     “那好,继续刚才的话题。所以,所有的算术逻辑运算,在我眼里都是简单的二进制运算。
现在回到刚才EFLAGS标志的问题,我从我的观点来阐述着几个标志位:
      CF标志:操作数的最高有效位发生进位或者借位的时候,这个标志位就是1.
         PF标志:操作结果的最低有效字节,换句话说,最右边的8位中,如果bit为1的总数
         是偶数,那么该标志就是1.
         AF标志:如果操作结果bit3发生了进位,那么该标志就是1.
         ZF标志:如果操作结果为0,那么该标志就是1。
      SF标志:就是操作数的最高有效位,就是说SF的值等于操作结果的最高有效位。
      OF标志:这个标志有点复杂,其结果是CF标志和次最高位是否发生进位(如果进位是1,
              没进位是0)进行异或的结果。
      以上是我设置标志位的规则,记住了哦。看你研究的那么辛苦,才告诉你。我要走了。”
      我:“等等,我还有好多问题要问啊,别走啊。。。。。。”
      一惊之下,突然醒来,口水流了一桌子原来是南柯一梦。
      赶紧整理下梦中的记忆,写在纸上进行验证。谁知结果竟然是正确的,因此写出来大家共享。
      


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 11
支持
分享
最新回复 (24)
雪    币: 6563
活跃值: (2399)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
晕倒,这样也可以?
2009-10-19 08:55
0
雪    币: 133
活跃值: (113)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
换句话说,程序开始执行的时候,传到AL的实际值就是0xFFH. 在我眼里,它就是11111111,究竟它代表-1还是代表255,我也不知道。只有作为程序员的你知道。这点你能理解么?”

谢谢。
2009-10-21 22:42
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有木有深壹点的?
2012-1-13 09:59
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
幽默,呵呵,支持一下
2012-1-13 10:15
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
吃惊,学习了
2018-1-18 16:12
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
AF标记位,是运算中第3位是否向第4位进借位,如果有则为1,主要用于汇编语言的bcd码
2018-1-30 19:50
0
雪    币: 229
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
吃惊,这个年代这种表述方法不多见了
2018-1-31 14:02
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习了
2018-2-23 17:25
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这故事贼6
2018-5-14 19:29
0
雪    币: 137
活跃值: (248)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

最后于 2019-7-7 23:32 被Puggs编辑 ,原因:
2018-6-27 21:26
0
雪    币: 3170
活跃值: (129)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
学习了
2018-8-5 22:26
0
雪    币: 1228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
通俗易懂
2018-8-5 23:14
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
感謝分享
2018-8-20 13:02
0
雪    币: 199
活跃值: (488)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习下
2018-9-3 20:58
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
早期单片机的PSW就是现在的eflag 寄存器位数越来越多 需求却没啥变化
2018-9-4 07:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
表述的挺好,但是小白我只剩下菜了
2019-11-5 16:09
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
表达方式很独特,通俗易懂
2019-11-16 19:53
0
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
不错,至少明白一点了
2019-12-13 17:36
0
雪    币: 252
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
睡觉睡出知识
2020-1-16 21:22
0
雪    币: 46
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
用这样的方法来告诉初学者真的很好
2020-1-17 02:25
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
学习了
2020-2-3 18:46
0
雪    币: 2119
活跃值: (1890)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
23
有意思
2020-2-4 15:02
0
雪    币: 2027
活跃值: (2659)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
大佬   OF标志位   如果操作数的最高位发生错位也会置1啊
2020-3-24 12:49
1
雪    币: 208
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
打卡。
2021-1-9 23:10
0
游客
登录 | 注册 方可回帖
返回
//