Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 浮点加法汇编算法_Assembly_Floating Point_Addition_Signed_Picoblaze - Fatal编程技术网

Assembly 浮点加法汇编算法

Assembly 浮点加法汇编算法,assembly,floating-point,addition,signed,picoblaze,Assembly,Floating Point,Addition,Signed,Picoblaze,我正在尝试为一个微微化微控制器编写一个二进制8位浮点加法算法(1个符号位、4个指数位和3个尾数位) 我可以用正数,但当有负数的时候我不知道怎么做 我的主要问题是设置结果的符号位,有人能解释一下如何正确设置吗 我的想法是检查两个数字的符号;如果它们都是正数,则将符号设置为0,如果它们都是负数,则将符号设置为1,并使用与之前相同的方法进行加法,如果一个是负数,一个是正数,则比较数字并使用较大数字的符号位,但我不确定如何比较这两个数字,代码变得有点混乱,有更好的方法吗?你很幸运。假设您使用的是类似IE

我正在尝试为一个微微化微控制器编写一个二进制8位浮点加法算法(1个符号位、4个指数位和3个尾数位)

我可以用正数,但当有负数的时候我不知道怎么做

我的主要问题是设置结果的符号位,有人能解释一下如何正确设置吗


我的想法是检查两个数字的符号;如果它们都是正数,则将符号设置为0,如果它们都是负数,则将符号设置为1,并使用与之前相同的方法进行加法,如果一个是负数,一个是正数,则比较数字并使用较大数字的符号位,但我不确定如何比较这两个数字,代码变得有点混乱,有更好的方法吗?

你很幸运。假设您使用的是类似IEEE754的表示法(即,指数是以适当的偏差存储的),则只需在经过一点处理后按字典顺序比较位字符串即可。注意,这假设您已经适当地处理了NaN值,因为NaN值应该只通过加法器传播

诀窍在于:

  • 忽略-0符号(即,如果有10000000,则将其视为00000000。)
  • 如果符号位为1,则翻转所有位(包括符号位)
  • 如果符号位为0,则翻转符号位(保持其他符号位不变)
现在,您可以按字典顺序比较这两个位字符串,字典顺序中较早出现的一个更小。您可能需要仔细安排如何处理
-0
,但我怀疑这对您来说不是什么大问题


事实上,这正是指数以偏置方式存储的原因,这样,在执行了我上面提到的位翻转技巧之后,只需将浮点数视为无符号数,就可以比较浮点数。

如果将它们转换为2的补码,则不必关心操作数的符号

  • 比较指数,并相应地将数字的尾数与最小指数对齐,同时添加隐藏位

  • 把数字变成2的补码。这需要在尾数的左侧额外一位考虑符号位,另一位处理加法溢出。因此,负数将由$gt;2,这是它们的绝对值对2^3的补码。请注意,两个最高有效位始终相等

  • 执行添加

  • 检测溢出。如果结果的两个最高有效位不相等,则存在溢出。在这种情况下,必须对结果进行算术右移并增加指数

  • 检测下溢。如果点左侧的三位数字相等,则存在下溢。在这种情况下,执行左移位,直到这三个数字不同或点右侧的所有位都为空,并相应地调整指数

  • 四舍五入

  • 返回从到2的补码到符号绝对值表示,并从其MSB确定结果的符号

  • 例如:

    A=1.1 B=-1.1 2^-1
    
    1. alignment. Numbers are extended to 6 bits right of point.
    
    A=+1.100000
    B=-0.110000
    
    2. two's complement
    A=001.100000
    B=2C(000.110000)=111.010000
    
    3 addition
    
    A       001.100000
    +B      111.010000
    =       000.110000
    
    4 overflows none
    
    5 underflows: shift result left 1 step and decrement exponent
    001.100000 2^-1
    
    6 rounding
    001.100 2^-1
    
    6 back to sign absolute value
    + (1.)100 2^-1
    
    另一个结果是否定的例子

    A=1.01 B=-1.1
    
    1. alignment. Numbers are extended to 6 bits right of point.
    
    A=+1.010000
    B=-1.100000
    
    2. two's complement
    A=001.010000
    B=2C(001.100000)=110.100000
    
    3 addition
    
     A      001.010000
    +B      110.100000
    =       111.110000
    
    4 overflows none (none overflow can happen if signs are different)
    
    5 underflows: shift result left 2 steps and decrement exponent by 2
    111.000000 2^-2
    
    6 rounding
    111.000 2^-2 (<0)
    
    6 back to sign absolute value
    -(1.)000 2^-2
    
    A=1.01b=-1.1
    1.对齐数字扩展到点右侧的6位。
    A=+1.010000
    B=-1.100000
    2.二元补码
    A=001.010000
    B=2C(001.100000)=110.100000
    3增加
    A 001.010000
    +B 110.100000
    =       111.110000
    4溢出无(如果符号不同,则不会发生溢出)
    5下溢:将结果向左移动2步,并将指数递减2
    111.000000 2^-2
    6四舍五入
    111.000 2^-2(通常(忽略像NaN这样的事情),对于
    A=B+C

    • 如果
      C
      的幅值大于
      B
      ,请交换
      B
      C
      ,以便知道
      B
      必须具有“大于或等于”的幅值。注意:幅值忽略符号位(例如-6的幅值大于+4,因为6>4)

    • 如果
      B
      C
      有不同的符号,则取反
      C
      并执行
      减去内部
      ;否则执行
      添加内部

    • 对于
      subtract_internal
      ,忽略符号位,减去大小(不要忘记
      B
      必须具有“较大或相等”的大小),然后将
      A
      的符号设置为等于
      B
      C
      的符号(它们无论如何都具有相同的符号)

    • 对于
      add_internal
      ,忽略符号位,添加大小,然后将
      A
      的符号设置为等于
      B
      C
      的符号(它们将具有相同的符号)

    另外,一般来说(忽略NaN之类的内容),对于
    A=B-C

    • 如果
      C
      的幅值大于
      B
      ,则交换
      B
      C
      ,并将两者都取反(例如
      A-C==(-C)-(-A)
      ),以便您知道
      B
      必须具有“更大或相等”的幅值

    • 如果
      B
      C
      有不同的符号,则对
      C
      取反,然后执行
      添加内部
      ;否则执行
      减去内部


    取决于您使用的浮点格式,即在输入加法器之前对数据做什么以及之后做什么。谢谢,这很有帮助谢谢您的帮助!