ARM中Q(饱和标志)的重要性

vku*_*rni 2 assembly arm processor isa

我想了解Q标志在ARM处理器中的重要性.我知道有一些像QADD,QSUB等的说明.

但我需要通过一些能够澄清这一概念的例子来理解这一点.

请解释一下.

谢谢

Mic*_*ael 6

"ARM体系结构参考手册"(ARM DDI 0100E)中对此进行了解释:

位[27] CPSR粘滞溢出标志,也称为Q标志.如果发生以下任何一种情况,则此标志设置为1:

  • 加法的饱和度导致a QADDQDADD指令
  • 减法的饱和度导致a QSUBQDSUB指令
  • 加倍中间的饱和度导致a QDADDQDSUB指令
  • 期间签署的溢出SMLA<x><y>SMLAW<y>指令

Q标志是粘性的,一旦它被设置为1,它就不受后续计算是否饱和和/或溢出的影响.其预期用途是:

  1. 使用MSR CPSR_f,#0指令清除Q标志(这也清除了条件代码标志).
  2. 执行一系列计算.
  3. 使用MRS Rn,CPSR指令读取CPSR,然后测试Q标志的值.如果它仍为0,则在步骤2期间不会发生上述类型的饱和或溢出.否则,至少发生一次饱和或溢出.

一个例子:

mov     r2,#0x70000000
qadd    r3,r2,r2
Run Code Online (Sandbox Code Playgroud)

0x70000000 + 0x70000000会变成0xE0000000,但由于qadd饱和,结果饱和到0x7FFFFFFF(最大的正32位整数)并且Q标志被置位.