gpt4 book ai didi

c - GCC/对象转储 : Generating compilable/buildable assembly (interspersed with C/C++) source?

转载 作者:太空狗 更新时间:2023-10-29 17:13:04 25 4
gpt4 key购买 nike

这接近 Using GCC to produce readable assembly? ,但我这里的上下文是 Atmel 的 avr-gcc(以及相应的 avr-objdump)(不过,我猜它会适用于整个 GCC 委员会)。

问题是,我有一个包含多个 .c 和 .cpp 文件的项目;最终被编译成一个可执行文件,与“主”.cpp 文件同名。在这个过程中,我可以通过两种方式获取汇编列表:

  • 我可以使用 -S 开关指示 gcc 发出程序集列表源(参见 Linux Assembly and Disassembly an Introduction);在这种情况下,我得到一个文件,内容如下:
    ...loop:  push r14  push r15  push r16  push r17  push r28  push r29/* prologue: function // frame size = 0 */  ldi r24,lo8(13)  ldi r22,lo8(1)  call digitalWrite  rjmp .L2.L3:  ldi r24,lo8(MyObj)  ldi r25,hi8(MyObj)  call _ZN16MYOBJ7connectEv.L2:  ldi r24,lo8(MyObj)  ldi r25,hi8(MyObj)  call _ZN16MYOBJ11isConnectedEv...

(还没有尝试过;但我想这段代码是可编译/可构建的....)

  • 我可以检查最终的可执行文件,并指示 objdump 使用 -S 开关发出汇编源代码;在这种情况下,我得到一个文件,内容如下:
    ...0000066a <init>:void init(){        // this needs to be called before setup() or some functions won't        // work there        sei();     66a:       78 94           sei     66c:       83 b7           in      r24, 0x33       ; 51     66e:       84 60           ori     r24, 0x04       ; 4     670:       83 bf           out     0x33, r24       ; 51...000006be <loop>:     6be:       ef 92           push    r14     6c0:       ff 92           push    r15     6c2:       0f 93           push    r16     6c4:       1f 93           push    r17     6c6:       cf 93           push    r28     6c8:       df 93           push    r29     6ca:       8d e0           ldi     r24, 0x0D       ; 13     6cc:       61 e0           ldi     r22, 0x01       ; 1     6ce:       0e 94 23 02     call    0x446   ; 0x446      6d2:       04 c0           rjmp    .+8             ; 0x6dc      6d4:       8d ef           ldi     r24, 0xFD       ; 253     6d6:       94 e0           ldi     r25, 0x04       ; 4     6d8:       0e 94 25 06     call    0xc4a   ; 0xc4a <_ZN16MYOBJ7connectEv>     6dc:       8d ef           ldi     r24, 0xFD       ; 253     6de:       94 e0           ldi     r25, 0x04       ; 4     6e0:       0e 94 21 06     call    0xc42   ; 0xc42 <_ZN16MYOBJ11isConnectedEv>...

(我确实尝试构建这段代码,但它确实失败了 - 它读取“行号”作为标签)

显然,两个 list (至少对于 loop 函数而言)代表相同的汇编代码;除了:

  • gcc 一个(应该)编译 -- objdump 一个
  • objdump 包含所有引用函数的列表,这些函数可以在“master”以外的文件中定义(例如,digitalWrite)—— gcc 一个
  • objdump 一个包含原始的 C/C++ 源代码行,其中“散布”着汇编(但只是偶尔,而且似乎只针对 C 文件?)——gcc 一个不会

那么,有没有一种方法可以获得“可编译”的汇编列表,但是包含所有内联函数,并且源 C/C++ 代码(可能在适当的情况下)散布为注释(因此它们不'干扰汇编文件的编译)? (缺少为 objdump 的输出编写解析器,即 :))

最佳答案

在上面的 gcc 命令行中添加选项 -fverbose-asm。 (这在 gcc 手册中,但它记录在“代码生成选项”下)

关于c - GCC/对象转储 : Generating compilable/buildable assembly (interspersed with C/C++) source?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com