因此,我正在编写一些能够读取数字列表的代码,将其分为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:行尾出现意外字符
现在,我非常确定这不是一个常量,除非常量在此处定义不同,并且除非在行尾出现了多余的字符,除非它将整个比较功能都算作多余的字符>
我是否应该更改任何内容,或者应该可以正常运行并且忽略这些警告?
谢谢
答案 0 :(得分:2)
如果要计算两个数的最大值,ARM汇编中的标准方法是这样的:
cmp r0, r1 @ if r0 > r1
movgt r2, r0 @ then r2 = r0
movle r2, r1 @ else r2 = r1
要将r0
,r1
和r2
中的最大值添加到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上有条件地执行。这就是指令集的全部功能所在。