为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?

Why is my C++ program's assembly output full of .ascii with no assembly code?

本文关键字:ascii 汇编 代码 程序 C++ 我的 程序集 输出 为什么      更新时间:2023-10-16

我正在使用 CMake 将一个C++文件编译到静态库中,并且我正在修改 CMake 生成的 Makefile,方法是将 -S -fverbose-asm 标志添加到 gcc 命令以获取程序集输出,但是生成的 .cpp.s 文件充满了看起来像十六进制数据的 .ascii 行,并且不包含程序集指令, 如下所示:

.ascii  "346+27404@22632!n247<)212264205377*204275364e"
.ascii  "31426270vi263373327n367$33235364N212316254324"

有谁知道可能导致这种情况的原因,以及我如何获得清晰的组装说明?

GCC 版本:5.4.0

您可能在启用链接时间优化(gcc -flto(的情况下进行编译,这使得"胖"对象文件还包含GCC的程序逻辑的中间表示以及常规asm。 (因此,全程序优化可以在链接时进行,允许跨源文件进行内联,并允许在只有原型可见时无法实现的进一步优化。 或者,如果您与不知道 LTO 的链接器链接,它将忽略 LTO 部分,只使用常规的机器代码部分。

https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html

GCC 使用带有八进制转义的.ascii作为一种紧凑(在 asm 源中(的方式以汇编者不知道的格式(GIMPLE 字节码(发出原始二进制文件。

另一种选择是.byte 12,34,...,即每个输出字节 2 到 4 个源字节,类似于带有八进制的 ASCII,它给出 1 到 4。(1 表示可打印 ASCII 范围内的任何字节(。

.long 0xabcd220c, 0x....quad将接近每个输出字节 2 个 asm 源字节。

这种效率考虑只针对GCC将提供给as.s临时文件;在.o中,数据将以二进制形式(在具有特殊名称的对象文件部分中(。 GCC 希望一种格式可以在 GCC 中快速序列化,并且汇编程序可以快速解析并转换回字节。 据推测,.ascii的双引号字符串使解析变得简单。