有没有办法可以方便地检查ARM C编译代码后所有常量被分配了什么值?

问题描述 投票:0回答:1

我正在使用 ARM 处理器编译 c 代码。

我需要检查在不同开关下定义不同的常量值。有一个工具可以编译多种配置。考虑是否可以从编译结果文件中获取常量值,或者故意创建一些操作,并读取反汇编结果。有什么建议么?预先感谢。

对ARM指令还不太熟悉。看起来并非所有指令都以直接的方式公开常量值。

c arm
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.