在 ARM Assembly 中比较数字时是否有正确的方法来存储值

When comparing numbers in ARM Assembly is there a correct way to store the value

所以我正在编写一些代码,能够读取数字列表,将其分成 3 个块,并确定这 3 个数字中哪个最大。然后我将从每个 3 块中取出最大值并将它们全部加在一起。

为了做到这一点,我将我的值存储在几个寄存器中:

 MOV r1,#0 ;loop counter
 MOV r2,#0 ;compare store 1
 MOV r3,#0 ;compare store 2
 MOV r4,#0 ;compare store 3
 MOV r5,#0 ;sum of values
 MOV r6,#0 ;which was greater in value
 LDR r8,=data_values ;the list of values

我正在使用 CMP 命令来比较值,但是我不确定我的方法是否适合存储和添加值。目前我得到了这个:

MOV r6,CMP r2,r3 ;Moving the comparison value into r6, my store for the greater value
MOV r6,CMP r6,r4 ;Comparing the larger value to the 3rd value
ADD r5,r5,r6 ;Adding the larger value to the sum

这看起来与我之前使用过的其他函数一致,但我不断收到这些错误:

task3.s(26): warning: A1865W: '#' not seen before constant expression

task3.s(26): error: A1137E: Unexpected characters at end of line

现在我很确定这不是常量,除非常量在这里有不同的定义,并且行尾也没有额外的字符,除非它将整个比较函数计为额外字符

有什么我应该更改的吗?或者应该 运行 可以忽略这些警告吗?

谢谢

如果你想计算两个数中的最大值,ARM 汇编中的标准方法是这样的:

cmp   r0, r1  @ if r0 > r1
movgt r2, r0  @ then r2 = r0
movle r2, r1  @ else r2 = r1

要将 r0r1r2 的最大值添加到 r3,您可能需要这样的东西:

cmp   r0, r1      @ if r0 < r1
movlt r0, r1      @ then r0 = r1 (i.e. r0 = max(r0, r1))
cmp   r0, r2      @ if r0 < r2
movlt r0, r2      @ then r0 = r2 (i.e. r0 = max(max(r0, r1), r2))
add   r3, r0, r3  @ r3 += r0

实现此操作而不破坏任何寄存器留作 reader.

的练习。

永远记住,几乎每条指令都可以在 ARM 上有条件地执行。这就是指令集的全部力量所在。