x86 汇编:声明嵌套数组

问题描述 投票:0回答:1

我是 x86 汇编的新手,在嵌套数组上查找资源以及使用 c 中的某些内容声明时它们的外观(例如:

long arr[5][10];
)时遇到困难。任何人都可以提供一些关于大会将转化为什么的见解吗?谢谢。

编辑:一年半之后,我明白这个问题作为内存中的数组是多么微不足道。在这种情况下,50 个 long 的数组将只是一个 50 * 8 = 400 字节的分配块(假设 sizeof(long) = 8)。 x86_64 asm 中类似的东西可以转化为

sub rsp, 400

但是,该示例仅适用于本地数组,在全局范围内它可能位于 .data 或 .bss 段中,例如:

section .bss
arr resq 50
c multidimensional-array x86
1个回答
1
投票

您是否尝试查看编译器输出? (https://godbolt.org/ / 如何从 GCC/clang 汇编输出中删除“噪音”?)。

字节只是字节;汇编器不知道也不关心程序中的指令将如何使用它们。

如果这是在全局范围内,通常类似于 GAS

.section .bss
.zero  4*5*10
.zero 200
完全相同,在 BSS 中保留 200 字节。或者
.comm arr, 200
做同样的事情而不切换部分。
.zero
/
.space
等有很多同义词来填充字节,参见GAS手册

或者在 NASM 中,

resd 5*10
section .bss
中。或者当然
resq
如果您的
long
是 64 位的话。

作为局部变量,它只是堆栈上保留的空间的一部分。

汇编没有与 C 相同意义上的类型,因此

long arr[5][10]
只是一块 200 或 400 字节的内存,与
char arr[200]
long arr[5*10]
相同。 C 整数类型是编译时的事情,影响编译器使用哪些指令来访问数据。

© www.soinside.com 2019 - 2024. All rights reserved.