ARM ASM +数组

时间:2014-02-06 01:32:40

标签: assembly arm

我需要帮助来编写ARM汇编语言例程,使用两种不同的方法初始化大小为N的数组X,使用两种不同的方法:索引,指针

我不知道如何在asm中执行此操作。

由于 JJ

2 个答案:

答案 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。立即抵消它也是如此。两个寄存器也很常见,但也许并不常见。这些与更高级语言中的指针和数组编程模型直接相关。