13

このプログラムを翻訳したところ、

#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

.com とはどういう意味ですか? dam はヒープ領域、スタック領域、またはデータ領域を使用しますか?

4

2 に答える 2

16

asマニュアルから:

..comm は、symbol という名前の共通シンボルを宣言します。リンク時に、あるオブジェクト ファイルの共通シンボルが、別のオブジェクト ファイルの同じ名前の定義済みシンボルまたは共通シンボルとマージされる場合があります。ld がシンボルの定義を認識しない場合 (1 つまたは複数の共通シンボルのみ)、初期化されていないメモリの length バイトを割り当てます。長さは絶対式でなければなりません。ld が同じ名前の共通シンボルを複数検出し、それらのサイズがすべて同じではない場合、ld は最大サイズを使用してスペースを割り当てます。

ELF を使用する場合、.comm ディレクティブはオプションの 3 番目の引数を取ります。これは、バイト境界として指定されたシンボルの目的のアラインメントです (たとえば、16 のアラインメントは、アドレスの最下位 4 ビットがゼロであることを意味します)。アラインメントは絶対式でなければならず、2 の累乗でなければなりません。ld が共通シンボルに初期化されていないメモリを割り当てる場合、シンボルを配置するときに配置が使用されます。配置が指定されていない場合、シンボルのサイズ以下の最大 2 のべき乗に配置が設定され、最大 16 まで設定されます。

于 2009-02-01T16:53:59.830 に答える