当结果返回内存时,处理器(尤其是ARM)如何在执行的后期解释溢出结果

当结果返回内存时,处理器(尤其是ARM)如何在执行的后期解释溢出结果,arm,integer-overflow,microprocessors,carryflag,Arm,Integer Overflow,Microprocessors,Carryflag,由于处理器遵循将数字表示为2的补码的惯例,他们如何知道由两个正数相加得到的数字是否仍然是正数而不是负数 例如,如果我添加两个32位数字: 让r2包含值-0x50192E32 示例代码: add r1, r2, #0x6F06410C str r1, [r3] 这里设置了一个溢出标志。 现在,如果我想在以后的指令中使用内存中存储的结果(代码中的某个地方…现在由于不同的指令,让处理器cpsr已更改),如下所示: ldr r5, [r3] add r7, r5 由于第一个add指令在其MSB中有1

由于处理器遵循将数字表示为2的补码的惯例,他们如何知道由两个正数相加得到的数字是否仍然是正数而不是负数

例如,如果我添加两个32位数字:

r2包含值-0x50192E32

示例代码:

add r1, r2, #0x6F06410C
str r1, [r3]
这里设置了一个溢出标志。 现在,如果我想在以后的指令中使用内存中存储的结果(代码中的某个地方…现在由于不同的指令,让处理器cpsr已更改),如下所示:

ldr r5, [r3]
add r7, r5
由于第一个add指令在其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中存储正确的结果呢。我们可以对代码做些什么来存储正确的结果吗?

如果您关心溢出条件,那么您需要在状态寄存器被其他操作覆盖之前检查溢出标志-根据所涉及的语言,这可能会导致生成异常,或使用较长的整数类型重试的操作。然而,许多语言(例如C语言)并不关心溢出条件——如果结果超出类型的范围,您只会得到错误的结果。如果用这种语言编写的程序需要检测溢出,它必须自己执行检查-例如,在加法的情况下,如果操作数具有相同的符号,但结果不同,则会出现溢出。

如果您关心溢出条件,然后,您需要在状态寄存器被其他操作覆盖之前检查溢出标志-这取决于所涉及的语言,这可能会导致生成异常,或者使用更长的整数类型重试该操作。然而,许多语言(例如C语言)并不关心溢出条件——如果结果超出类型的范围,您只会得到错误的结果。如果用这种语言编写的程序需要检测溢出,它就必须自己执行检查——例如,在加法的情况下,如果操作数具有相同的符号,但结果不同,则会出现溢出。

我知道我和其他人一样多次讨论过这一点

进位标志可以视为加法的无符号溢出标志,也可以视为减法的借用标志或不借用标志,具体取决于您的体系结构。v标志是加法(减法)的有符号溢出标志。你是唯一知道或关心加法是有符号还是无符号的人,因为对于加法/减法来说,这并不重要

不管它是什么标志,或者是什么体系结构,你都必须确保如果你关心结果(无论是结果还是标志),你会将这些信息保留多久,直到你需要使用它为止,这不是处理器的工作,也不是指令集,也不是一般的体系结构。它在寄存器中寻找答案,就像在标记中一样,这一切都取决于程序员。如果你在乎的话,就保持现状吧。这个问题就像说你如何解决这个问题:

if(a==b)
{
}
stuff;
stuff;
I want to do the if a == b thing now.

程序员完全有责任在需要使用时进行比较,而不是在其他时间,在比较时保存比较结果,然后在需要使用时检查条件

我知道我和其他人一样多次谈到这一点

进位标志可以视为加法的无符号溢出标志,也可以视为减法的借用标志或不借用标志,具体取决于您的体系结构。v标志是加法(减法)的有符号溢出标志。你是唯一知道或关心加法是有符号还是无符号的人,因为对于加法/减法来说,这并不重要

不管它是什么标志,或者是什么体系结构,你都必须确保如果你关心结果(无论是结果还是标志),你会将这些信息保留多久,直到你需要使用它为止,这不是处理器的工作,也不是指令集,也不是一般的体系结构。它在寄存器中寻找答案,就像在标记中一样,这一切都取决于程序员。如果你在乎的话,就保持现状吧。这个问题就像说你如何解决这个问题:

if(a==b)
{
}
stuff;
stuff;
I want to do the if a == b thing now.

程序员完全有责任在需要使用时进行比较,而不是在其他时间,在比较时保存比较结果,然后在需要使用时检查条件

我不太明白你在问什么-2的补码意味着有符号性与算术运算无关,所以
add
只是将数字相加。这里没有任何东西被解释为有符号或无符号,因为没有任何代码以任何方式测试标志(请注意,甚至没有任何东西对其进行设置;这将是
添加
)。我同意这是不清楚的。我瘦了