我正在使用 ARM 处理器编译 c 代码。
我需要检查在不同开关下定义不同的常量值。有一个工具可以编译多种配置。考虑是否可以从编译结果文件中获取常量值,或者故意创建一些操作,并读取反汇编结果。有什么建议么?预先感谢。
对ARM指令还不太熟悉。看起来并非所有指令都以直接的方式公开常量值。
GCC 和 Clang 能够在其汇编输出中包含任意文本,并在该文本中包含各种值。
在任何函数内,包含以下行:
#if GenerateConstants
__asm__("# MyConstant = %c0" : : "i" (MyConstant));
#endif
然后使用开关
-DGenerateConstants
和 -S
进行编译。编译器将生成一个名为 SourceFileName.s
的文件,如果需要,您可以使用 -o Name
为其指定不同的名称。
然后
grep " MyConstant =" Name
会找到这一行,显示类似:
## 我的常量 = 17
然后您可以使用
sed
或其他工具来提取该值。
在
__asm__
中,"i"
表示生成“立即”操作数。接下来的 (MyConstant)
给出了它应该具有的值。在第一个带引号的字符串中,%c0
被替换为该操作数的值。
0
指示要替换的操作数 — 如果 __asm__
中后面列出了多个操作数,则它们的编号为 0、1、2、3,依此类推。 (还有一种命名它们而不是编号的机制,此处未显示。)通常,%0
将被替换为适合目标汇编语言的立即操作数形式,例如$17
或#17
。但是, c
修饰符表示使用裸常量,因此替换文本只是值,在本例中为 17
。
上面的示例包含
#
来标记汇编语言中的注释。 Clang 至少(我没有测试 GCC)可以将其转换为目标汇编语言。在 ARM Mac 上进行测试,在汇编输出中显示 ; MyConstant = 17
。这就是为什么我没有在上面的 #
模式中包含 grep
。