- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这接近 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/
我只找到了几个无法访问的方法 - intersperseList。 为什么无法访问?或者是否有某个函数可以进行散布操作? ScalaZ 的功能示例: scala> intersperse(List(1
是否有一个函数可以让我连接多个数组,它们之间有分隔符(分隔符也是数组),类似于 join 的工作方式但不限于字符串? 该函数可以是标准 JS 或主要库的一部分,例如 lodash(这就是它在标签中引用
我学会了intersperse function来自 Haskell,并一直在寻找 C# 中的实现。 Intersperse 有 2 个参数,一个 IEnumerable 源和一个 T 元素。它返回一
我在 Perl 6 中缺少的一件事是 intersperse功能 like Haskell has : The intersperse function takes an element and a
我有一个像这样的多行条件: command1 \ && command2 \ && command3 这很好,但我想在每个命令后添加注释,如下所示: command1 \ # Comm
是否有一些类似于 Haskell 的 intersperse 函数的原生 objective c 方法? 举个例子 Prelude> Data.List.intersperse ',' "abcdef
这接近 Using GCC to produce readable assembly? ,但我这里的上下文是 Atmel 的 avr-gcc(以及相应的 avr-objdump)(不过,我猜它会适用于
我是一名优秀的程序员,十分优秀!