所以我正在制作一些能够读取数字列表的代码,将其分成 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: 行尾出现意外字符
现在我很确定这不是一个常量,除非这里的常量定义不同并且行尾也没有额外的字符,除非它将整个比较函数计算为额外的字符
有什么我应该改变的,或者它应该运行良好而这些警告被忽略吗?
谢谢
如果要计算两个数字的最大值,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 上有条件地执行。这就是指令集的全部力量所在。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句