我正在阅读JR Gibson的第5章ARM装配书。在对整数ADD
和SUB
指令的解释中,在计算结果后给出了表更新标志。
我无法理解的是2个整数A
,B
的无符号整数加法的标志更新,其中A
和B
“不是0”结果为2^31-1 < result < 2^32
(即0x7FFFFFFF
,0x100000000
)
它指出上面的结果是标记N=1
,Z=0
,C=0
,V=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
位(因此MI
和LS
为Yes
)
我期待的是N
标志可以设置,因为第31位是1
(从位0
开始计算),但结果仍然是正数(即PL = Yes
,因为它在2^31-1 ~ 2^32
)范围内。
我在这里不了解一些事情吗?
答案 0 :(得分:3)
N标志始终设置为结果的第31位。处理器不关心您是添加还是减去有符号或无符号数字 - 两种情况下得到的位模式都相同。同样,PL / MI后缀只检查N标志;他们不在乎你是否考虑签名或未签名的数字。
签名对于乘法和除法很重要,这就是为什么这些指令有两个助记符。
答案 1 :(得分:2)
减法和加法(可以)使用相同的加法器(逻辑),减法将加法器的一个输入与操作数的反转相加,然后设置进位,加法直接输入操作数并将进位归零。(反转并添加一个)溢出时的有符号和无符号内容(加/减)。 C是无符号溢出位,V是有符号溢出位。硬件并不关心,通常如果指令生成一个,它会同时生成它们。高级语言和/或用户关心,硬件只执行基本上无符号的添加并设置标志。
如上所述,乘法是一种不同的野兽,需要一个未签名和签名的版本。
ARM ARM和其他ARM文档向您展示哪些标志位与哪个助记符相关联,不要担心助记符的字母是什么,请关注您有兴趣测试的标志位。在描述如何逐个指令地生成标志位时,ARM文档非常详细。