汇编语言 - 将二进制补码十六进制转换为其十进制数

时间:2015-05-07 02:31:35

标签: assembly hex decimal type-conversion base

我目前正试图弄清楚如何从二进制补码十六进制到其基数为10的正确转换。我们得到了一个汇编语言程序,它可以添加和减去32位整数,并需要获取寄存器的值并进行转换。

这是我尝试过的,然而,我的教授说我在最后的计算中犯了一个严重错误,我不知道是什么。

这是寄存器EAX值:FFFC0888

然后我将它从二进制补码十六进制转换为十六进制: FFFC0888 - > 0003F778

最后将十六进制转换为十进制。 0003F778 =(0 X 16 ^ 7)+(0 X 16 ^ 6)+(0 X 16 ^ 5)+(3 X 16 ^ 4)+(15 X 16 ^ 3)+(7 X 16 ^ 2)+ (7 X 16 ^ 1)+(8 X 16 ^ 0)= 0 + 0 + 0 + 196608 + 61440 + 1792 + 112 + 8 = 259960

我对259960的最终答案是不正确的,有人可以帮我启发一下我做错了什么吗?谢谢!

2 个答案:

答案 0 :(得分:1)

(@ chathux暗示答案)。

您的值为X == FFFC0888_16。当您将X转换为0003F778时(通过"二进制补码"),您这样做是因为您(应该)认为X值是"否定" (符号位置位)。您生成的十进制值259960是正确的幅度,即abs(X)== 259960_10。但是X的值是负的,所以正确的答案是X == -259960_10。

如果X == 7FFC0888_16的值为正值(符号位为零),则在生成小数值之前不应该使用二进制补码。

答案 1 :(得分:1)

转换中的所有内容都是正确的,但以下情况除外:

0003F778 = -(0 + 0 + 0 + (3 X 16^4) + (15 X 16^3) + (7 X 16^2) + (7 X 16^1) + (8 X 16^0)) 

其中0003F778是2s补码整数数据。