我想了解ARM处理器中Q标志的重要性。我知道有一些特定的指令,如QADD,QSUB等。但我需要通过一些例子来澄清这个概念。
mrfwxfqh1#
这在“ARM架构参考手册”(ARM DDI 0100 E)中有解释:CPSR的位[27]是一个 sticky overflow 标志,也称为Q标志。如果发生以下任何一种情况,该标志将被设置为1:
CPSR
QADD
QDADD
QSUB
QDSUB
SMLA<x><y>
SMLAW<y>
Q标志是 * 粘性的 *,因为一旦它被设置为1,它就不受后续计算是否饱和和/或溢出的影响。1.使用MSR CPSR_f,#0指令清除Q标志(这也会清除条件码标志)。1.执行一系列计算。1.使用MRS Rn,CPSR指令读取CPSR,然后测试Q标志的值。如果它仍然为0,则在步骤2中没有发生上述类型的饱和或溢出。否则,至少发生了一个饱和或溢出示例。举个例子:
MSR CPSR_f,#0
MRS Rn,CPSR
mov r2,#0x70000000 qadd r3,r2,r2
0x70000000 + 0x70000000将变为0xE0000000,但由于qadd饱和,结果饱和为0x7FFFFFFF(最大的正32位整数),并设置Q标志。
0x70000000 + 0x70000000
0xE0000000
qadd
0x7FFFFFFF
1条答案
按热度按时间mrfwxfqh1#
这在“ARM架构参考手册”(ARM DDI 0100 E)中有解释:
CPSR
的位[27]是一个 sticky overflow 标志,也称为Q标志。如果发生以下任何一种情况,该标志将被设置为1:QADD
或QDADD
指令QSUB
或QDSUB
指令QDADD
或QDSUB
指令中加倍中间结果的饱和SMLA<x><y>
或SMLAW<y>
指令期间发生有符号溢出Q标志是 * 粘性的 *,因为一旦它被设置为1,它就不受后续计算是否饱和和/或溢出的影响。
1.使用
MSR CPSR_f,#0
指令清除Q标志(这也会清除条件码标志)。1.执行一系列计算。
1.使用
MRS Rn,CPSR
指令读取CPSR
,然后测试Q标志的值。如果它仍然为0,则在步骤2中没有发生上述类型的饱和或溢出。否则,至少发生了一个饱和或溢出示例。举个例子:
0x70000000 + 0x70000000
将变为0xE0000000
,但由于qadd
饱和,结果饱和为0x7FFFFFFF
(最大的正32位整数),并设置Q标志。