汇编语言 - 将二进制补码转换为以 10 为底的等效十六进制

Assembly Language - Converting Two's Complement Hexadecimal to its Base 10 Equivalent

我目前正在研究如何正确地将二进制补码转换为以 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是不正确的,请大神帮忙指教一下我做错了什么?谢谢!

(@chathux 提示答案)。

您的值 X==FFFC0888_16。当您将 X 转换为 0003F778(通过取 "twos complement")时,您这样做是因为您(应该)认为 X 的值是 "negative"(设置了符号位)。你产生的十进制值 259960 是正确的量级,即 abs(X) == 259960_10。但是X的值为负,所以正确答案是X == -259960_10.

如果X==7FFC0888_16的值为正值(符号位为零),则在产生十进制值之前不应该取补码。

您转换中的所有内容都是正确的,除了:

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补整数数据。