如何在 armv8 程序集中创建数组?

How to create an array in armv8 assembly?

我觉得这是一个简单的问题,但到目前为止我无法在互联网上的任何地方或我的任何教科书或 class 的 powerpoint 中找到它。我有一个项目,如果不先创建一个数组就无法开始,所以我只是问如何翻译

int A[10];

(A[10] 当然是大小为 10 的数组)

进入Armv8汇编代码

编辑:老实说,我不明白回答我问题的问题,如果有帮助,它正在 DS-5 中编译

对于堆栈上的本地数组,它与其他架构几乎相同。只需减去堆栈指针并将您的值存储在那里。

对于int a[10]sub sp, sp, #48会在栈上分配你的数组。正如 Nate Eldredge 在评论中提到的,ARMv8 要求硬件进行 16 字节堆栈对齐,因此您不能写 sub sp, sp, #40。您可以存储一些值,例如 str r, [sp] 代表 *a = rstr r, [sp, #4] 代表 a[1] = r,等等。

对于全局数组,只需在.bss中定义一个符号并为其分配足够的space。

.bss
a:
    .zero 40

这将分配一个具有 10 个 32 位 ints 的全局数组。

这样的全局数组属于可执行文件中的某个部分。您可以使用自定义 read-write-executable 质量制作您喜欢的任何部分,但通常,non-zero-initialized 可修改数据位于 .data 部分,而可修改 all-zero 数据位于 .bss 部分。有关基本详细信息,请参阅 here


您可以随时检查 Godbolt 以了解 C 中的每个语句是如何转换为汇编语言的。检查有无优化,两者都会给你不同的有趣信息。

例如,下面是使用 -O3 的 Clang 如何用 C 翻译这个简单的代码。

int a[10];

void f() {
    a[1] = 2;
}

void g() {
    volatile int b[10];
    b[3] = 4;
}

/*
  .text
f:
        adrp    x8, a+4
        mov     w9, #2
        str     w9, [x8, :lo12:a+4]
        ret
g:
        sub     sp, sp, #16
        mov     w8, #4
        str     w8, [sp, #12]
        add     sp, sp, #16
        ret

  .bss
a:
        .zero   40
*/

Godbolt 指令 未被 过滤,因此部分切换可见。 (上面的块过滤掉了指令,除了 .section 指令。)

了解局部数组和全局数组的分配和访问方式有何不同。我相信现在你有更具体的问题,以防你仍然有问题。