ARM算术加法和标志更新

时间:2011-07-04 16:18:59

标签: assembly arm

我正在阅读JR Gibson的第5章ARM装配书。在对整数ADDSUB指令的解释中,在计算结果后给出了表更新标志。

我无法理解的是2个整数AB的无符号整数加法的标志更新,其中AB“不是0”结果为2^31-1 < result < 2^32(即0x7FFFFFFF0x100000000

之间

它指出上面的结果是标记N=1Z=0C=0V=X(不关心)被设置并且指令助记符扩展被解释为< / p>

EQ = No, NE = Yes, CS = No, CC = Yes, MI = Yes, PL = No, VS, VC = X, HI = No, LS = Yes, LT, GT, LE = X

为什么在32位范围内导致无符号加法会导致设置N位(因此MILSYes

我期待的是N标志可以设置,因为第31位是1(从位0开始计算),但结果仍然是正数(即PL = Yes ,因为它在2^31-1 ~ 2^32)范围内。

我在这里不了解一些事情吗?

2 个答案:

答案 0 :(得分:3)

N标志始终设置为结果的第31位。处理器不关心您是添加还是减去有符号或无符号数字 - 两种情况下得到的位模式都相同。同样,PL / MI后缀只检查N标志;他们不在乎你是否考虑签名或未签名的数字。

签名对于乘法和除法很重要,这就是为什么这些指令有两个助记符。

答案 1 :(得分:2)

减法和加法(可以)使用相同的加法器(逻辑),减法将加法器的一个输入与操作数的反转相加,然后设置进位,加法直接输入操作数并将进位归零。(反转并添加一个)溢出时的有符号和无符号内容(加/减)。 C是无符号溢出位,V是有符号溢出位。硬件并不关心,通常如果指令生成一个,它会同时生成它们。高级语言和/或用户关心,硬件只执行基本上无符号的添加并设置标志。

如上所述,乘法是一种不同的野兽,需要一个未签名和签名的版本。

ARM ARM和其他ARM文档向您展示哪些标志位与哪个助记符相关联,不要担心助记符的字母是什么,请关注您有兴趣测试的标志位。在描述如何逐个指令地生成标志位时,ARM文档非常详细。