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

时间:2019-01-17 13:32:43

标签: assembly arm keil

因此,我正在编写一些能够读取数字列表的代码,将其分为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):警告:A1865W:在常量表达式之前看不到“#”

  

task3.s(26):错误:A1137E:行尾出现意外字符

现在,我非常确定这不是一个常量,除非常量在此处定义不同,并且除非在行尾出现了多余的字符,除非它将整个比较功能都算作多余的字符

Image showing the whole line highlighted with no extra characters sitting at the end

我是否应该更改任何内容,或者应该可以正常运行并且忽略这些警告?

谢谢

1 个答案:

答案 0 :(得分:2)

如果要计算两个数的最大值,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

实现此目的以使您不会浪费任何寄存器,这是读者的一项练习。

始终牢记,几乎每条指令都可以在ARM上有条件地执行。这就是指令集的全部功能所在。