在ARM汇编中开发循环
我必须编写一个程序,将寄存器X,Y和Z初始化为零,然后循环10次,每次将1加到寄存器X.如果寄存器X是偶数,则将寄存器Y加1,如果寄存器X可以被3整除,则添加一个寄存器Z.在ARM汇编中开发循环
我写了一些代码,但我不确定它是否正确,我会很感激任何反馈。
R0, #0 R1, #0
R2, #0
Loop: R3, #0
CMP R0, #10
BEQ endif
ADD R0, #1
TST R0, #1
ADDEQ R1, #1
MOV R3, R0 MOD 3
CMP R3, #0
ADDEQ R2, #1
B loop
Endif:
回答:
code review questions aren't really on topic here,但我们有时会对asm做出例外。
我会很感激任何反馈意见。
Asm循环通常应该看起来像C do { } while(condition)
。
通常情况下,最好将条件分支放在循环的底部,这样就不需要单独的无条件分支。 (特别是当环路已知至少运行一次,所以你并不需要在第一次迭代前检查或跳转到有条件的。)
在你的情况,这将是
@ do{ ...
add r0, #1
cmp r0, #10
bne Loop @ } while(r0 != 10)
或者从r0 = 10开始,并使用subs r0, #1
来减去并设置标志,所以你不需要单独的cmp
指令。
TST R0, #1 ADDEQ R1, #1
工作正常。你也可以无条件地增加了低位,而不是有条件地将0或1
AND R3, R0, #1 ADD R1, R3
如果你是的Thumb2模式,这将需要额外的MOV指令提取低位非破坏性,因为你将不会有3操作数AND
。或者会吗?您可以使用位移来消除所有其他位,而IIRC Thumb2仍然允许移位作为寄存器操作数的一部分。
MOV R3, R0 LSL #31 @ I think this is legal syntax ADD R1, R3 LSR #31
MOV R3, R0 MOD 3
这看起来真的很狡猾。这甚至组装?很确定ARM只能移动和旋转。 Mod 3是一个非常昂贵的计算。
你应该做的是使用一个减计数器,它从3开始倒计数,当它到零时重置为3。您可以使用ARM条件/预测执行来完成条件添加。
SUBS R3, #1 MOVEQ R3, #3
ADDEQ R2, #1
以上是 在ARM汇编中开发循环 的全部内容, 来源链接: utcz.com/qa/263554.html