.comm是什么意思?

时间:2009-02-01 16:37:03

标签: gcc assembly x86 gas

我刚刚翻译了这个程序,

#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是否使用堆空间,堆栈空间或数据空间?

2 个答案:

答案 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