【问题标题】:ARM arithmetic addition and flags updateARM 算术加法和标志更新
【发布时间】:2011-07-04 16:18:58
【问题描述】:

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

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

它指出上述结果导致标志N=1Z=0C=0V=X(无关)被设置,指令助记符扩展被解释为

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,因为它在范围 @987654343 内@)。

我这里有什么不明白吗?

【问题讨论】:

  • @skaffman:感谢编辑!下次我会做得更好.. ;)

标签: assembly arm


【解决方案1】:

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

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

【讨论】:

  • 是的。但我不明白为什么助记符扩展名是 MI(或 LS)。难道不能是PL(或GE),以便正确完成后续的条件执行吗?
  • 查看here 了解后缀的含义。你可以使用任何适合你的目的。
【解决方案2】:

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

如上所述,乘法是一种不同的野兽,需要一个无符号和有符号的版本。

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

【讨论】:

  • 感谢您的信息 - “C 是无符号溢出位,V 是有符号溢出位”。
  • 对,至少对于添加而言。我会假设乘法,但必须查一下。乘法需要单独的有符号和无符号乘法器,因此它们可以共享相同的溢出。
猜你喜欢
  • 2023-01-10
  • 1970-01-01
  • 2020-04-02
  • 2015-04-13
  • 2013-10-27
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多