由于处理器遵循将数字表示为 2 的补码的约定,它们如何知道由两个正数相加产生的数字是否仍然是正数而不是负数。
例如,如果我添加两个 32 位数字:
让r2包含值- 0x50192E32
示例代码:
add r1, r2, #0x6F06410C
str r1, [r3]
这里设置了溢出标志。现在,如果我想在以后的指令中使用内存中存储的结果(在代码中的某处......现在由于不同的指令让处理器cpsr已更改),如下所示:
ldr r5, [r3]
add r7, r5
由于第一条加法指令的 MSB 中有1 ,即现在 r5的MSB中有1,处理器如何解释该值。因为两个正数相加的正确结果是正数。是否仅仅因为MSB 有 1,它解释为负数?在这种情况下,我们会得到与预期不同的结果。
例如,在4 位机器中:
2 的补码:4=0100 和 5=0101;-4=1100 和 -5=1011
现在4+5=9并且如果它作为 1001 存储在寄存器/内存中,然后如果它被另一条指令访问并且给定处理器以 2 的补码格式存储数字并检查 MSB并认为它是负数7.
如果这一切都取决于程序员,那么如何将正确的结果存储在 reg/mem 中。无论如何,我们可以对我们的代码做些什么来存储正确的结果?