有关汇编语言中标志设置逻辑的问题

时间:2019-02-07 21:10:00

标签: assembly arm

在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的实际值?

谢谢

1 个答案:

答案 0 :(得分:1)

ARM®v7-M Architecture Reference Manual(这些说明可一直追溯到ARM 1)。

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

在这里,您没有选择设置条件代码寄存器,因此两条条件路径完全彼此分开,并且每个条件路径中的操作都不会影响条件寄存器的值。

条件代码寄存器与ALU的操作正交-仅当您要执行64位加法或减法时才重要,在这种情况下,您可能会关心o V erflow或{ {1}} arry flags。

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