在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的实际值?
谢谢
答案 0 :(得分:1)
从ARM®v7-M Architecture Reference Manual(这些说明可一直追溯到ARM 1)。
§A4.4.1除了将结果放入目标寄存器外,这些指令还可以选择 [使用'S'后缀” 根据以下结果设置条件代码标志:操作。如果一条指令未设置标志,则保留前一条指令中该标志的现有值。
在这里,您没有选择设置条件代码寄存器,因此两条条件路径完全彼此分开,并且每个条件路径中的操作都不会影响条件寄存器的值。
条件代码寄存器与ALU的操作正交-仅当您要执行64位加法或减法时才重要,在这种情况下,您可能会关心o V
erflow或{ {1}} arry flags。
您的汇编代码似乎与伪代码一致。