在C代码中,有没有一种方法可以从ASM指令的文本表示(例如cmpwi r3, 0x20
)转换为其二进制表示(0x2c030020
)?
我正在编写将嵌入到另一个应用程序中的代码。该代码应该修改正在运行的程序的行为/代码。这意味着有一堆像这样的代码行:
*((volatile int *)(0x80001234)) = 0x2c030020;
该代码将ASM指令cmpwi r3, 0x20
写入到0x80001234,覆盖该地址处的当前指令。现在,在我的C代码中拥有常量"0x2c030020"而不知道它的作用对于维护代码来说是不好的。因此,我通常会向上述代码添加注释,说明ASM指令:// 2c 03 00 20 = cmpwi r3, 0x20
然而,有时候这些注释会失去同步。我可能快速更改整数值但忘记更新注释,或者我可能在注释中打错字,导致混淆。
有没有其他方法可以做类似的事情呢?(伪代码)*((volatile int *)(0x80001234)) = asm("cmpwi r3, 0x20");
这样会导致0x2c030020被写入到80001234吗?还是我需要一个hacky的解决方案,通过自定义预处理器运行在我的C源文件上,用它们的字节码替换ASM指令?我知道有使用
asm()
函数的C语法来进行内联汇编代码,但那将执行给定的ASM指令,而不是给我它们的二进制表示。
(const char*) -> (unsigned long)
:创建一个函数,比如unsigned long asm(const char* asm);
,其主体将是一个巨大的if
语句,匹配所有已知字符串并返回相应的字节码。基本上,你需要硬编码这个映射关系。否则,你可以调用一个汇编器并以某种方式获取其输出,但这将花费更多时间。 - ForceBruif
语句、其他控制结构和函数指针。 - Eric Postpischilif
或其他控制结构。然而,我有一个嵌入式ppc系统的现有二进制文件,并且没有源代码。我只能通过注入自定义代码来修改它。 我考虑过从字符串到字节表示的映射表,但这会大幅增加代码大小,所以我正在寻找一个编译时解决方案,而不是在运行时计算值的解决方案。 - Florian Bach