【问题标题】:What does .comm mean?.com 是什么意思?
【发布时间】:2010-10-04 19:20:43
【问题描述】:

我刚刚翻译了这个程序,

#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使用堆空间、栈空间还是数据空间?

【问题讨论】:

    标签: gcc assembly x86 gnu-assembler


    【解决方案1】:

    来自as 手册:

    ..comm 声明了一个通用符号,名为 象征。链接时,常用符号 在一个目标文件中可以合并 相同的定义或通用符号 另一个目标文件中的名称。如果 ld 没有看到的定义 符号——只有一个或多个常见的 符号——然后它会分配长度 未初始化内存的字节数。长度 必须是绝对表达式。如果 ld 看到多个常见的符号 相同的名字,而且他们并不都有 大小相同,会分配空间 使用最大的尺寸。

    使用 ELF 时,.comm 指令 接受可选的第三个参数。这 是所需的对齐方式 符号,指定为字节边界 (例如,16 的对齐方式意味着 的最低有效 4 位 地址应为零)。这 对齐必须是绝对的 表达,它必须是一种力量 二。如果 ld 分配未初始化 记忆的共同符号,它会 放置时使用对齐方式 象征。如果没有指定对齐方式, 将对齐设置为 两个小于或的最大幂 等于符号的大小,最多 最多 16 个。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 2011-08-12
        • 2017-06-11
        • 2018-03-05
        • 2023-03-27
        • 1970-01-01
        • 2013-03-09
        相关资源
        最近更新 更多