将 32 位带符号整数存储到寄存器中的具体细节是什么?
What are the specifics of STORING a 32 bit signed integer into a register?
我的数字类型是有符号的二进制补码整数。
在内存寄存器 %rdi/edi/di 中,我有 0xFFFFFFFF。
在 %rsi/esi/si 中,我有 0x80000000.
我的指令是addl %edi, %esi
.
如何正确添加这些?
我认为答案是:
因为我要添加完整的 32 位寄存器,所以我可以添加全部数量的 0xFFFFFFFF 和 0x80000000。
所以,我将一个有符号整数添加到一个有符号整数中,它们都是 32 位的。我有效地添加了 -2147483648 和 0x80000000。由于 0x80000000 是十六进制的 2147483648,所以我将这两个相加得到零。
零旗激活
进位标志被激活(因为我添加了 32 位寄存器的前导值)
在32位二进制补码中,0xFFFFFFFF
表示-1,0x80000000
表示-2,147,483,648。这些总和为 −2,147,483,649。这不适合 32 位,因此会溢出。计算结果为0x7FFFFFFF
,表示2,147,483,647.
在位级别:FFFFFFFF
加上80000000
产生17FFFFFFF
,这意味着7FFFFFFF
存储在32位目标中,1
是进位。
我的数字类型是有符号的二进制补码整数。
在内存寄存器 %rdi/edi/di 中,我有 0xFFFFFFFF。 在 %rsi/esi/si 中,我有 0x80000000.
我的指令是addl %edi, %esi
.
如何正确添加这些?
我认为答案是:
因为我要添加完整的 32 位寄存器,所以我可以添加全部数量的 0xFFFFFFFF 和 0x80000000。
所以,我将一个有符号整数添加到一个有符号整数中,它们都是 32 位的。我有效地添加了 -2147483648 和 0x80000000。由于 0x80000000 是十六进制的 2147483648,所以我将这两个相加得到零。
零旗激活 进位标志被激活(因为我添加了 32 位寄存器的前导值)
在32位二进制补码中,0xFFFFFFFF
表示-1,0x80000000
表示-2,147,483,648。这些总和为 −2,147,483,649。这不适合 32 位,因此会溢出。计算结果为0x7FFFFFFF
,表示2,147,483,647.
在位级别:FFFFFFFF
加上80000000
产生17FFFFFFF
,这意味着7FFFFFFF
存储在32位目标中,1
是进位。