我刚刚翻译了这个程序,
#includeint 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是否使用堆空间,堆栈空间或数据空间?
从as
手册:
..comm声明一个名为symbol的常用符号.链接时,一个目标文件中的公共符号可以与另一个目标文件中的相同名称的已定义或公共符号合并.如果ld没有看到符号的定义 - 只有一个或多个公共符号 - 那么它将分配未初始化内存的长度字节.长度必须是绝对的表达.如果ld看到多个具有相同名称的公共符号,并且它们并非都具有相同的大小,则它将使用最大的大小分配空间.
使用ELF时,.comm指令采用可选的第三个参数.这是符号的期望对齐,指定为字节边界(例如,16的对齐意味着地址的最低有效4位应为零).对齐必须是绝对表达式,并且必须是2的幂.如果ld为公共符号分配未初始化的内存,则在放置符号时将使用对齐.如果未指定对齐,则将对齐设置为小于或等于符号大小的最大2的幂,最多为16.