在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

回到顶部