【问题标题】:ARM ASM + arrayARM ASM + 阵列
【发布时间】:2014-03-02 18:32:38
【问题描述】:

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

我不知道如何在 asm 中做到这一点。

谢谢 jj

【问题讨论】:

  • 您的“问题”听起来太像“为我做我的工作”。当人们尝试某事、卡住并寻求帮助时,SO 就起作用了。表现出更多的努力和细节,你会得到很多帮助。
  • 欢迎来到 StackOverflow。你能用不同的语言来做这件事吗(使用这两种方法中的任何一种)?你知道汇编语法(寄存器、命令等)的基础知识吗?
  • 我正在学习 ARM 课程。我理解代码的循环部分。我不确定如何像 c int x [ ] 中的索引和 int *x 中的指针一样增加。 __asm void foo (uint32 *array, uint32 size, uint32 value) Loop LDR R3, [R0] ADD R1, R1, R3 ADD R0, R0, #+4 SUBS R2, R2, #0x1 BNE Loop STR R1, 结果跨度>

标签: assembly arm


【解决方案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

【讨论】:

  • 为了补充这个答案,在 ARM 中,任何寄存器都可以是值或指针。只需使用ldr/str [rX] 使其成为指针。 index 将是寻址模式[Rbase, Ridx]。请参阅Summary of addressing modesWikipedia 了解您需要了解的概念; Dwelch 在他的回答中有类似的信息。
【解决方案2】:

就像在 C 中一样,你可以拥有一个指针,你可以通过改变它来销毁它

*ptr; 
...
ptr++;  

你可以使用一个带偏移量的数组

data[x]; 
...
x++;

Arm 提供了几种寻址模式,其中一种是具有立即偏移量的寄存器(您可以将零作为偏移量)

ldr r0,[r1]

隐含零偏移

ldr r0,[r1,#0]

如果您不想让汇编程序以这种方式对其进行编码,则不必键入它。

然后修改 r1(在本例中)以在内存中移动(通过数组)。

另一种寻址方式是寄存器偏移

ldr r0,[r1,r2] 

您可以将两个寄存器之一作为数组的基数,另一个作为在其中移动的索引。

在 arm 文档中查找这些内容并弄清楚如何正确使用它们来完成您的作业。

用于加载和存储的寄存器间接寻址在指令集中非常常见,而不仅仅是 ARM。立即抵消它也是如此。两个寄存器也很常见,但可能并不常见。这些直接与高级语言中的指针和数组编程模型相关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多