我是 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
您是否尝试查看编译器输出? (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 整数类型是编译时的事情,影响编译器使用哪些指令来访问数据。