首页 > 解决方案 > 关于汇编语言设置标志的逻辑问题

问题描述

例如,给定 C 中的代码

if a>b
  c=a+b+10
else
  c=b-a

我的汇编语言代码不使用分支:

ADR R0,a
ADR R1,b
ADR R2,c
LDR R0,[R0]
LDR R1,[R1]

CMP R0,R1
ADDGT R0,R0,R1
ADDGT R0,#10
STRGT R0,[R2]

SUBLE R1,R1,R0
STRLE R1,[R2]

假设,R0>R1,所以标志设置在 CMP 行

由于这些标志,ADDGT 和 STRGT 将运行。如果 ADDGT R0,R0,R1 的值会改变标志(可能导致 V=1)怎么办。我们没有在这里做'ADDGTS'所以下一个ADDGT可以运行但不会影响R0的实际值?

谢谢

标签: assemblyarm

解决方案


来自ARM®v7-M 体系结构参考手册(这些说明可一直追溯到 ARM 1)。

§A4.4.1除了将结果放入目标寄存器之外,这些指令还可以选择[使用'S'后缀]根据操作结果设置条件代码标志。如果一条指令未设置标志,则保留前一条指令中该标志的现有值。

这里选择了不设置条件码寄存器,所以两条条件路径是完全分开的,每条条件路径中的操作都不会影响条件寄存器的值。

条件代码寄存器与 ALU 的操作正交——它可能只在您想要进行 64 位加法或减法时才重要,在这种情况下,您可能会关心V溢出或数组C标志。

您的汇编代码似乎与伪代码一致。


推荐阅读