我刚刚翻译了这个程序,
#include <stdio.h>
int dam[1000][1000];
int main (int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!\n");
return 0;
}
使用gcc生成装配,
.cstring
LC0:
.ascii "Hello, World!\0"
.text
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
call L3
"L00000000001$pb":
L3:
popl %ebx
leal LC0-"L00000000001$pb"(%ebx), %eax
movl %eax, (%esp)
call L_puts$stub
movl $0, %eax
addl $20, %esp
popl %ebx
leave
ret
.comm _dam,1000000,5
.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_puts$stub:
.indirect_symbol _puts
hlt ; hlt ; hlt ; hlt ; hlt
.subsections_via_symbols
.comm是什么意思? dam是否使用堆空间,堆栈空间或数据空间?
答案 0 :(得分:13)
来自as
手册:
.. comm声明了一个名为的公共符号 符号。链接时,一个共同的符号 在一个目标文件中可以合并 定义的或共同的符号 另一个目标文件中的名称。如果ld 没有看到的定义 符号 - 只是一个或多个常见的 符号 - 然后它将分配长度 未初始化内存的字节数。长度 必须是一个绝对的表达。如果ld 看到多个常见符号 同名,他们并非都有 相同的大小,它将分配空间 使用最大的尺寸。
使用ELF时,.comm指令 采用可选的第三个参数。这个 是期望的对齐 符号,指定为字节边界 (例如,16的对齐方式 那个最不重要的4位 地址应为零)。该 对齐必须是绝对的 表达,它必须是一种力量 二。如果ld分配未初始化 对于共同符号的记忆,它会 放置时使用对齐方式 符号。如果未指定对齐方式, 因为将对齐设置为 最大功率小于或小于2 等于符号的大小,最多为 最多16个。
答案 1 :(得分:3)
.comm名称,大小,对齐
.comm指令在数据部分中分配存储。存储由标识符名称引用。大小以字节为单位,必须为正整数。名称无法预定义。对齐是可选的。如果指定了alignment,则name的地址与alignment的倍数对齐。
来源:https://docs.oracle.com/cd/E26502_01/html/E28388/eoiyg.html