我刚翻译了这个程序,
#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使用堆空间、堆栈空间还是数据空间?
发布于 2009-02-01 16:54:00
从as手册中:
..comm声明了一个名为symbol的公共符号。链接时,一个对象文件中的公共符号可以与另一个对象文件中定义的或相同名称的公共符号合并。如果ld没有看到符号的定义--只看到一个或多个公共符号--那么它将分配未初始化内存的长度字节。长度必须是绝对表达式。如果ld看到多个具有相同名称的公共符号,并且它们的大小并不相同,它将使用最大的大小来分配空间。
在使用ELF时,.comm指令有一个可选的第三个参数。这是所需的符号对齐,指定为字节边界(例如,对齐16意味着地址的最低有效4位应为零)。对齐必须是绝对表达式,并且必须是2的幂。如果ld为公共符号分配未初始化的内存,它将在放置符号时使用对齐。如果未指定对齐方式,as会将对齐方式设置为小于或等于符号大小的2的最大幂,最大值为16。
发布于 2015-12-28 14:32:27
.comm名称、大小、对齐方式
.comm指令在数据段中分配存储。存储由标识符名引用。大小以字节为单位,必须为正整数。不能预定义名称。对齐是可选的。如果指定了对齐方式,名称的地址将与对齐方式的倍数对齐。
来源:https://docs.oracle.com/cd/E26502_01/html/E28388/eoiyg.html
https://stackoverflow.com/questions/501105
复制相似问题