飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2968|回复: 4

浅析标志寄存器 《汇编语言》第十一章学习笔记

[复制链接]

该用户从未签到

发表于 2009-4-26 17:17:25 | 显示全部楼层 |阅读模式
第十一章 标志寄存器的必要性

    CPU的指令集中肯定要有数据比较的操作。我们知道对于数据 A 和 B 既可以将其看成是有符号数,也可作为无符号数来处理。A 和 B 之间的关系只有三种:相等、大于、小于。今天我们要做的就是设计两个数值大小的比较。

---------------------------------------------------------------------

情况一: A = B

    我们之前的设计,在CUP内部构造了8个寄存器,寄存器就是方便我们使用的变量空间,同时寄存器也为某些指令的执行提供所需要的参数。

    若 A = B ,如何将这个结果告诉程序,来告诉判断指令如何执行呢? 我们可以从内存中取一个变量来存放这个比较结果,当然也可以和之前设计通用寄存器那样,再增加一个通用寄存器来保存这个比较的中间值(比较的结果)。显然结果只有两种可能:相等 or 不等 。所以只需要 1 位(one bit)即可保存。

那我们再设计一个 寄存器 TX 来保存这个比较的中间值  

          7654 3210 高位->低位
0000 0000 0000 0000 寄存器 TX

我们设置 TX 寄存器的第0位来表示其结果是否为零(该位称为置零位),若为则置 1 (结果是零吗?若等于0 则TRUE ),反之则置 0 ;

于是比较是否相等的指令,只需要来判断 TX 的第0位数值就OK了。


CMP   A, B
JE    相等则跳  ( 判断下TX的第0位是否为 1 )
JNE   不相等则跳( 判断下TX的第0位是否为 0 )

---------------------------------------------------------------------

情况二: A 和 B 为无符号数

我们来看一下无符号数 A - B 的情况,相等的情况略去

A == FFFDH
B == FFFEH

我们平时在做减法运算的时候,减数的某位小于被减数的该位,则向高位借1,我们也按该思想来处理计算机中的减法。当减数小于被减数时,也向高位(想象中的)借1。

  1FFFD
-  FFFE
--------

于是我们就可以根据无符号数是否借位来可判断两数的大小。

我们设置 TX 寄存器的第1位来表示其结果的正负(该位称为借位符),若借位则置 1 ;反之则置 0 ;

CMP   A, B
JA    大于则跳 ( 判断下TX的第1位是否为 0 )
JB    小于则跳 ( 判断下TX的第1位是否为 1 )

---------------------------------------------------------------------

情况三: A 和 B 为有符号数

再来看有符号数的比较,我们生活中比较两个数值的大小一般都是相减后判断结果是否大于零。

A - B :  若 > 0  ==> A > B ;若 < 0  ==>  A < B

所以我们只需要对结果做正负的判断,就可以确定其大小关系。

我们设置 TX 寄存器的第2位来表示其结果的正负(该位称为符号位),若为正则置 0 ;若为负则置 1 ;


但在CPU中的还是该情况吗?我们来看一下 8位数据的运算(8位可表示的大小为 -128 ~ +127 之间)。

100 + 100 = ?

  0110 0100 = 100
+ 0110 0100 = 100
------------
  1100 1000 = -56

100 + 100  = -56  这个结果我们显然是无法接受的。

原因就在于在计算结果超出了8位数据所能表示的范围而覆盖了符号位。我们称这种现象叫做溢出。那什么情况下才可能发生溢出呢?只有这两种情况:

低与下限(低于-128) 只能是 负 + 负 (负 - 正)
超过上线(高于 127) 只能是 正 + 正 (正 - 负)

我们注意到 “负 + 负” 和 “正 + 正”这两种情况操作数的符号位是相同的,若溢出后,其结果的符号位则与操作数相反,利用这个规律,我们来判断结果是否溢出。

我们设置 TX 第3位来标记结果是否溢出(该位称为溢出位):若溢出则置 1,未溢出则置 0.

通过上方的分析,我们就可以来比较有符号数的大小:

if(TX第2位 == TX第3位) // (符号位)==(溢出位)  ==> A >=  B ( 注:A=B 时 (符号位)==(溢出位) )
if(TX第2位 != TX第3位) // (符号位)!=(溢出位)  ==> A <   B

CMP   A, B
JG    大于则跳        ( TX的第2位 == 第3位 && 第0位!=0 )
JGE   大于或等于转移  ( TX的第2位 == 第3位 || 第0位==0)
JL    小于则跳        ( TX的第2位 != 第3位 )


---------------------------------------------------------------------

    OK,当我们设计出自己的判断数据大小的模型后,我们再来看书上所介绍的Inter CPU是如何实现两数值比较的。按照我们的推理虚拟出来的TX寄存器其实就是Inter的 Flag 寄存器。我们所定义的低四位就是书上所说的几个标志寄存器。我们是按照自己的推理设计出来了,而CPU的设计者也是按正常人的思路来设计的。在学知识的时候,试着逆向的把知识的由来推演出来,理解上自然就会更加深入。
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-7-19 09:20
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2009-4-28 00:31:02 | 显示全部楼层
    谢谢!!收藏先。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-5 20:56:17 | 显示全部楼层
    谢谢!!收藏先。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2009-5-5 23:18:20 | 显示全部楼层
    呵呵学习了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-27 10:58:18 | 显示全部楼层
    无符号数与有符号数在加法和减法指令上没有区别,但是之后的条件跳转指令是有区别的。

    与无符号数配套的条件跳转指令:

    ja/jnbe       大于        cf=0 && zf=0
    jae/jnb/jnc   大于或等于   cf=0
    jb/jc         小于        cf=1
    jbe/jna       小于或等于   cf=1 || zf=1

    与有符号数配套的条件跳转指令:

    jg/jnle       大于        sf^of=0 && zf=0
    jge/jnl       大于或等于   sf^of=0
    jl/jnge       小于        sf^of=1
    jle/jng       小于或等于   sf^of=1 || zf=1

    注:&& 表示 且,|| 表示 或,^ 表示 异或。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表