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

Assembly 汇编语言中标志设置的逻辑问题,assembly,arm,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

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),该怎么办。我们在这里没有“添加GTS”,所以下一个添加GT可以运行,但不会影响R0的实际值

感谢来自的(这些说明可一直追溯到ARM 1)

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

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

条件代码寄存器与ALU的操作正交-可能只有在您想要进行64位加法或减法运算时才起作用,在这种情况下,您可能关心o
V
erflow或
C
arry标志


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

“但不会影响R0的实际值吗?”当然。但是如果执行
GT
路径,则不会执行
LE
路径,因此修改
R0
并不重要。除非您在显示的代码后面需要旧值。如果没有编写的S,这三条指令要么全部执行(并且全部修改R0),要么不执行。同样,其他两个将运行并修改/使用r1或不使用r1。如果您根据汇编程序将S放入ADDSGT或ADDGTS,则可以/将更改影响下一条指令的标志。如arm架构参考手册所述,标志似乎仅用于调节?我们被告知,标志对于编译器理解寄存器的真实值非常重要。如果我错了,请纠正我。您的意思是:只需要将标志设置为“CMP”,这样它就可以控制“if-else”语句。如果不设置R0的标志,R0的正确结果仍将被存储?一些ALU指令确实使用了条件代码标志,例如,
ADC
,它与进位一起添加。移位还可以设置进位标志。§见A2.5.2。上述代码中的算术指令均未与条件代码寄存器交互。