0

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

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

我的指示是addl %edi, %esi

如何正确添加这些?

我认为答案是:

由于我要添加完整的 32 位寄存器,因此我可以添加完整的 0xFFFFFFFF 和 0x80000000。

所以,我有一个有符号整数添加到一个有符号的,它们都是 32 位的。我有效地添加了 -2147483648 和 0x80000000。由于 0x80000000 是十六进制的 2147483648,我将这两个相加得到零。

零标志被激活 进位标志被激活(因为我添加了 32 位寄存器的前导值)

4

1 回答 1

4

在 32 位二进制补码中,0xFFFFFFFF表示 -1,0x80000000表示 -2,147,483,648。这些总和为 -2,147,483,649。这不适合 32 位,因此会溢出。计算结果为0x7FFFFFFF,表示 2,147,483,647。

在位级别:FFFFFFFFplus80000000产生17FFFFFFF,这意味着7FFFFFFF存储在 32 位目标中,并且1是进位。

于 2018-10-20T13:48:25.637 回答