为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
Why is my C++ program's assembly output full of .ascii with no assembly code?
我正在使用 CMake 将一个C++文件编译到静态库中,并且我正在修改 CMake 生成的 Makefile,方法是将 -S -fverbose-asm 标志添加到 gcc 命令以获取程序集输出,但是生成的 .cpp.s 文件充满了看起来像十六进制数据的 .ascii 行,并且不包含程序集指令, 如下所示:
.ascii "346+274 04@226 32!n247<)212264205377*204275364e"
.ascii "314 26270vi263373327n367$332 35364N212316254324"
有谁知道可能导致这种情况的原因,以及我如何获得清晰的组装说明?
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
的双引号字符串使解析变得简单。
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- ascii 和 unicode 在处理级别有什么区别吗?
- 在C++中使用 ASCII 代码将输入从小写转换为大写
- 弄清楚如何在C++中将整数读入 ASCII
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 如何修复艺术ASCII,我点击一个字母就可以了,但输入一个阶段艺术出来了
- 使用指针将 ASCII 值添加到整数
- 用于 ASCII 的环绕式 C++
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- RE2 不匹配非 ASCII 字符
- 打印从 0 到 255 的所有 ASCII 字符
- C++ 电话号码字母拨号程序 - 语法错别字?还是非 ASCII 字符?
- 无符号字符打印其 ASCII 值
- 为什么 memcpy() 和其他类似的函数使用汇编?
- Windows 非 ASCII 文件路径
- 非 ASCII 文件路径窗口