在 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
要将 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
实现此操作而不破坏任何寄存器留作 reader.
的练习。
永远记住,几乎每条指令都可以在 ARM 上有条件地执行。这就是指令集的全部力量所在。
所以我正在编写一些代码,能够读取数字列表,将其分成 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
要将 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
实现此操作而不破坏任何寄存器留作 reader.
的练习。永远记住,几乎每条指令都可以在 ARM 上有条件地执行。这就是指令集的全部力量所在。