views:

439

answers:

1

I just translated this program,

#include <stdio.h>

int dam[1000][1000];


int main (int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

to assembly using gcc producing,

    .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

What does .comm means? Does dam use heap space, stack space or data space?

+3  A: 

From the as manual:

..comm declares a common symbol named symbol. When linking, a common symbol in one object file may be merged with a defined or common symbol of the same name in another object file. If ld does not see a definition for the symbol--just one or more common symbols--then it will allocate length bytes of uninitialized memory. length must be an absolute expression. If ld sees multiple common symbols with the same name, and they do not all have the same size, it will allocate space using the largest size.

When using ELF, the .comm directive takes an optional third argument. This is the desired alignment of the symbol, specified as a byte boundary (for example, an alignment of 16 means that the least significant 4 bits of the address should be zero). The alignment must be an absolute expression, and it must be a power of two. If ld allocates uninitialized memory for the common symbol, it will use the alignment when placing the symbol. If no alignment is specified, as will set the alignment to the largest power of two less than or equal to the size of the symbol, up to a maximum of 16.

Eli Bendersky