Assembly 从编译器生成的标签是什么意思?

Assembly 从编译器生成的标签是什么意思?,assembly,gcc,Assembly,Gcc,编译器生成一个gas,它有一些奇怪的标签,用于符号的奇怪名称: .file "a.c" .text .section .rodata .LC0: .string "string" .text .globl main .type main, @function main: pushq %rbp movq %rsp, %rbp leaq .LC0(%rip), %rdi call p

编译器生成一个gas,它有一些奇怪的标签,用于符号的奇怪名称:

.file   "a.c"
    .text
    .section    .rodata
.LC0:
    .string "string"
    .text
    .globl  main
    .type   main, @function
main:
    pushq   %rbp
    movq    %rsp, %rbp
    leaq    .LC0(%rip), %rdi
    call    puts@PLT
    movl    $0, %eax
    popq    %rbp
    ret
    .size   main, .-main
    .ident  "GCC: (Debian 8.3.0-6) 8.3.0"
LCO:?标签应该以分号结尾:,指令应该以点开头。那么它是标签指令吗?这个名字是LC0吗?为什么它的名字和变量名不一样?如果其他程序中的其他符号不在本程序中,特别是labelsdirective?,将有.LB0。。。这些名称是随机的吗?

.Lname是.o符号表中省略的名称,适合在一个对象文件中内部使用。没有任何以.L开头的GAS指令

GCC在函数内部的代码中使用.L0和向上自动编号的标签作为跳转目标

它对只读常量数据使用.LC0和向上自动编号的标签,如字符串文本、FP常量以及它希望通过SIMD复制的数组初始值设定项,而不是作为即时数据存储

为什么它的名字和变量名不一样

什么变量名?我想您已经打印了字符串\n;所以它是一个匿名字符串文本。如果您在全局范围内这样做,您将得到一个mystring:label

是的,它们是随机的。不幸的是,它们与指令共享名称空间。
   static char mystring[] = "string";