存储32位有符号整数到寄存器的具体细节是什么?

8 浏览
0 Comments

存储32位有符号整数到寄存器的具体细节是什么?

我的数字类型是有符号的补码整数。

在内存寄存器%rdi/edi/di中,我有0xFFFFFFFF。

在%rsi/esi/si中,我有0x80000000。

我的指令是addl %edi, %esi

如何正确相加这些数?

我想答案是:

由于我正在相加完整的32位寄存器,我有添加0xFFFFFFFF和0x80000000的好处。

所以,我有一个有符号整数加上一个有符号整数,并且它们都是32位的。我实际上是在相加-2147483648和0x80000000。由于0x80000000在十六进制中是2147483648,我将这两个数相加得到零。

零标志位被激活。

进位标志位被激活(因为我正在相加32位寄存器的最高位值)。

0
0 Comments

在32位二进制补码表示中,0xFFFFFFFF表示-1,0x80000000表示-2,147,483,648。这两个数的和是-2,147,483,649。这个结果无法在32位中存储,因此会发生溢出。计算得出的结果是0x7FFFFFFF,表示2,147,483,647。

在位级上:FFFFFFFF加上80000000得到17FFFFFFF,这意味着32位目标寄存器中存储的是7FFFFFFF,而1是一个进位。

啊,好的,我算错了。谢谢你的纠正。

问题:由于有一个“进位”,那么它是不是表示为:1x7FFFFFFF?

_Senate: 32位寄存器没有第33位。它不会放在目标寄存器中。进位位会被设置在标志寄存器中。“1x7FFFFFFF”不是常用的表示法。在“0x12345678”中的“0”并不代表一个零位,它是C语言历史发展所强制的表示法。如果事情发展得不同,我们可以使用“hex 12345678”。

“不常用”意味着它被使用过,所以如果我理解正确,“0”是一个标志而不是位?这是否意味着我们讨论的这个计算有一个CF标志和一个OF标志?

_Senate: 我不知道它在任何地方被使用过。不,这个“0”不是一个标志。他们只是想要在C语言中使用十六进制常量,而不能以字母开头,因为以字母开头的任何内容都已经是一个标识符,所以必须以数字或特殊字符开头,而且他们可能不想使用特殊字符。它不能只有数字,因为十进制数已经使用了那些数字。所以他们需要一个数字和其他东西。我想有人建议使用“0x”,然后就一直沿用下来了。它除了表示“这是一个十六进制数”之外,并没有其他意义。

0