如何在 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 = r
,str r, [sp, #4]
代表 a[1] = r
,等等。
对于全局数组,只需在.bss
中定义一个符号并为其分配足够的space。
.bss
a:
.zero 40
这将分配一个具有 10 个 32 位 int
s 的全局数组。
这样的全局数组属于可执行文件中的某个部分。您可以使用自定义 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 指令。)
了解局部数组和全局数组的分配和访问方式有何不同。我相信现在你有更具体的问题,以防你仍然有问题。
我觉得这是一个简单的问题,但到目前为止我无法在互联网上的任何地方或我的任何教科书或 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 = r
,str r, [sp, #4]
代表 a[1] = r
,等等。
对于全局数组,只需在.bss
中定义一个符号并为其分配足够的space。
.bss
a:
.zero 40
这将分配一个具有 10 个 32 位 int
s 的全局数组。
这样的全局数组属于可执行文件中的某个部分。您可以使用自定义 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 指令。)
了解局部数组和全局数组的分配和访问方式有何不同。我相信现在你有更具体的问题,以防你仍然有问题。