代码之家  ›  专栏  ›  技术社区  ›  philcolbourn

如何使用gcc将源代码行与程序集输出内联?

  •  14
  • philcolbourn  · 技术社区  · 16 年前

    我想让C源代码行与程序集输出内联,以查看正在生成什么代码。

    我尝试过海湾合作委员会的选择,比如 -S -Wa,-ahlms (甚至) -Wa,--gstabs 因为我在某个地方读过。

    哦!顺便说一句,我在Mac上,所以我没有 objdump .

    (对不起,这太短了,我得下车了!)

    产量 gcc pc-clisp.c -S -g -fverbose-asm -fnested-functions

    .globl _getBool
    _getBool:
    LFB32:
    LM21:
        pushl   %ebp    #
    LCFI30:
        movl    %esp, %ebp      #,
    LCFI31:
        subl    $8, %esp        #,
    LCFI32:
    LM22:
        movzbl  8(%ebp), %eax   # atom.pred, D.4112
        movzbl  %al, %eax       # D.4112, D.4113
        andl    $-16, %eax      #, D.4114
        sarl    $4, %eax        #, D.4115
        testl   %eax, %eax      # D.4115
        setne   %al     #, tmp64
        movzbl  %al, %eax       # tmp64, D.4111
        leave
        ret
    LFE32:
    
    3 回复  |  直到 13 年前
        1
  •  11
  •   Douglas Leeder    16 年前

    可能是调试+后处理步骤?

    gcc <source.c> -S -g -fverbose-asm
    

    发现 .file 1 "1.c" 告诉你文件号到文件名的映射。 然后在 .loc 1 8 0 线。我不知道如何用一个shell命令来完成它,但是一个简短的脚本应该能够做到:

    #!/usr/bin/env python
    
    import re
    import sys
    
    filename = sys.argv[1]
    
    f = open(filename)
    lines = f.readlines()
    f.close()
    
    FILE_RE=re.compile(r"\s+\.file (\d+) \"(.*)\"")
    LOC_RE =re.compile(r"\s+\.loc (\d+) (\d+)")
    
    output = []
    files = {}
    for line in lines:
        output.append(line)
        mo = FILE_RE.match(line)
        if mo is not None:
           files[mo.group(1)] = open(mo.group(2)).readlines()
           print mo.group(1),"=",mo.group(2)
           continue
        mo = LOC_RE.match(line)
        if mo is not None:
           print mo.group(1),"=",mo.group(2)
           source = files[mo.group(1)][int(mo.group(2))-1]
           output.append("\t#"+source)
    
    f = open(filename+".2","w")
    f.writelines(output)
    f.close()
    
        2
  •  5
  •   Stephen Canon    16 年前

    这不是你想要的,但你可能会发现 -S -fverbose-asm 有帮助。

        3
  •  2
  •   didito    15 年前

    你可以通过MacPorts获得objdump。只需输入“binutils”包,然后使用“gobjdump”