Assembly 在臂总成中比较数字时,是否有正确的方法存储值

Assembly 在臂总成中比较数字时,是否有正确的方法存储值,assembly,arm,keil,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 gr

所以我制作了一些代码,可以读取一个数字列表,把它分成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
我使用这个命令来比较这些值,但是我不能完全确定我的方法在存储和添加这些值时是否正确。现在我有了这个:

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
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
要将
r0
r1
r2
中的最大值添加到
r3
中,您可能需要如下内容:

cmp   r0, r1  @ if r0 > r1
movgt r2, r0  @ then r2 = r0
movle r2, r1  @ else r2 = r1
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
cmp r0,r1@if r0
实现这一点,使您不会破坏任何寄存器,这是留给读者的一个练习


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

如果要计算两个数字的最大值,ARM汇编中的标准方法如下所示:

cmp   r0, r1  @ if r0 > r1
movgt r2, r0  @ then r2 = r0
movle r2, r1  @ else r2 = r1
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
要将
r0
r1
r2
中的最大值添加到
r3
中,您可能需要如下内容:

cmp   r0, r1  @ if r0 > r1
movgt r2, r0  @ then r2 = r0
movle r2, r1  @ else r2 = r1
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
cmp r0,r1@if r0
实现这一点,使您不会破坏任何寄存器,这是留给读者的一个练习


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

不是这样做的<代码>CMP
是一条指令。不能将其用作操作数。而且它不是
MAX
。您将需要条件移动或分支。@Jester感谢您的回答,我是否能够从指令中提取输出,或者它是否自动标记任何输出。另外,我不明白你所说的“它不是
MAX
”是什么意思,或者这是一个我不应该使用的替代指令?你在
MOV r6,CMP r2,r3
中使用它的方式表明你可能认为它是类似于
r6=MAX(r2,r3)
的东西,而事实并非如此
CMP
不产生任何数值输出,它只是设置标志。这是一个比较。老实说,这正是我认为它会起作用的方式,你介意为我指出这样一个好的起点吗?这样我就可以得到结构或者一些指令?这当然是C代码,但这是可以应用于asm解决方案的逻辑。或者让C编译器帮你做:)你不是这样做的<代码>CMP
是一条指令。不能将其用作操作数。而且它不是
MAX
。您将需要条件移动或分支。@Jester感谢您的回答,我是否能够从指令中提取输出,或者它是否自动标记任何输出。另外,我不明白你所说的“它不是
MAX
”是什么意思,或者这是一个我不应该使用的替代指令?你在
MOV r6,CMP r2,r3
中使用它的方式表明你可能认为它是类似于
r6=MAX(r2,r3)
的东西,而事实并非如此
CMP
不产生任何数值输出,它只是设置标志。这是一个比较。老实说,这正是我认为它会起作用的方式,你介意为我指出这样一个好的起点吗?这样我就可以得到结构或者一些指令?这当然是C代码,但这是可以应用于asm解决方案的逻辑。或者让一个C编译器帮你做:)我明白了,谢谢你澄清了一些事情,我自己来试试这个方法。我明白了,谢谢你澄清了一些事情,我自己来试试这个方法