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 是什么意思?大坝使用堆空间、堆栈空间还是数据空间?

4

2 回答 2

16

as手册:

..comm 声明了一个名为 symbol 的通用符号。链接时,一个对象文件中的公共符号可能与另一个对象文件中已定义或同名的公共符号合并。如果 ld 没有看到符号的定义——只有一个或多个常见符号——那么它将分配长度字节的未初始化内存。长度必须是绝对表达式。如果 ld 看到多个具有相同名称的常见符号,并且它们的大小不同,它将使用最大的大小分配空间。

使用 ELF 时,.comm 指令采用可选的第三个参数。这是符号的所需对齐方式,指定为字节边界(例如,16 对齐意味着地址的最低有效 4 位应为零)。对齐必须是绝对表达式,并且必须是 2 的幂。如果 ld 为公共符号分配未初始化的内存,它将在放置符号时使用对齐方式。如果未指定对齐方式,as 会将对齐方式设置为小于或等于符号大小的 2 的最大幂,最大为 16。

于 2009-02-01T16:53:59.830 回答
5

.comm 名称、大小、对齐方式

.comm 指令在数据部分分配存储。存储由标识符名称引用。大小以字节为单位,必须为正整数。无法预定义名称。对齐是可选的。如果指定了对齐方式,则名称的地址将对齐到对齐的倍数。

来源:https ://docs.oracle.com/cd/E26502_01/html/E28388/eoiyg.html

于 2015-12-28T06:32:27.013 回答