我需要帮助来编写ARM汇编语言例程,使用两种不同的方法初始化大小为N的数组X,使用两种不同的方法:索引,指针
我不知道如何在asm中执行此操作。
由于 JJ
答案 0 :(得分:1)
以ARM汇编语言实现函数的最简单(非最快)方法:
.global foo
@
@ call from C as void foo(uint32 *array, uint32 size, uint32 value);
@
@ standard calling convention:
@ Values passed in register R0=*array, R1=size, R2=value
@
foo:
str r2,[r0],#4 @ Store the value and increment the pointer
subs r1,r1,#1 @ decrement the count
bne foo @ branch until the count is 0
bx lr @ return to caller
答案 1 :(得分:1)
就像在C中一样,你可以通过改变它来获得一个基本上可以销毁的指针
*ptr;
...
ptr++;
您可以使用带偏移的数组
data[x];
...
x++;
Arm提供了几种寻址模式,其中一种是具有立即偏移的寄存器(可以将零作为偏移量)
ldr r0,[r1]
暗示零偏移量
ldr r0,[r1,#0]
如果你不想让汇编程序以这种方式编码,你就不必输入它。
然后你修改r1(在这种情况下)通过内存(通过数组)。
另一种寻址模式是寄存器偏移
ldr r0,[r1,r2]
你可以让两个寄存器中的一个作为数组的基础,另一个是通过它移动的索引。
在arm文档中查看这些内容并找出如何正确使用它们来完成作业。
加载和存储的寄存器间接寻址在指令集中非常常见,而不仅仅是ARM。立即抵消它也是如此。两个寄存器也很常见,但也许并不常见。这些与更高级语言中的指针和数组编程模型直接相关。