gpt4 book ai didi

c - 获取 C 代码中 ASM 指令的字节表示

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:16 25 4
gpt4 key购买 nike

有没有办法在 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 指令,而不是给我它们的二进制表示。

最佳答案

这听起来像是一件疯狂的事情,但我认为您这样做有充分的理由。没有一点疯狂,生活就没有乐趣。

您可以使用的一种方法是在构建期间使用汇编程序来生成编译时常量。

第一步是创建一个文件,其中包含您将使用的所有汇编指令,每行一个。

例如:

cmpwi   3,0x20
addi 3,3,0
blr

将该文件命名为 input.def。然后,使用这个 shell 脚本:

#!/usr/bin/env bash

(cat << HEADER
.global main
.text
main:
HEADER
cat input.def) > asm.s

powerpc-linux-gnu-as asm.s -o asm.o

powerpc-linux-gnu-objdump -d asm.o | \
sed '1,/<main>/ d' | \
paste -d'\t' - input.def | \
awk -F'\t' '{
bytes=$2
asm=$4
disasm=$3
gsub(/ /, "", bytes);
gsub(/[, ]+/, "_", asm);
printf("#define ASM_%-20s 0x%s // disassembly: %s\n", asm, bytes, disasm)
}'

# Clean temporaries
rm asm.s asm.o

(我在这里使用 GNU 汇编程序和 objdump。如果您不使用这些工具,您可能需要更改这部分。objdump 在这里用作美化的 hexdump 实用程序。)

这个 shell 脚本:

  1. 创建程序集文件
  2. 组装它
  3. 将它与 input.def 放在一起。 (这样它就可以看到您键入的程序集。)
  4. 重新格式化十六进制,使其成为合法的 C 常量。重新格式化 asm,使其成为合法的 C 符号。然后,编写一个定义来将指令名称映射到常量。
  5. 将所有这些放在 asm.h 中

这是很多工作,但您可以在编译时完成所有工作。

这会产生一个名为 asm.h 的头文件:

#define ASM_cmpwi_3_0x20         0x2c030020    // disassembly: cmpwi   r3,32
#define ASM_addi_3_3_0 0x38630000 // disassembly: addi r3,r3,0
#define ASM_blr 0x4e800020 // disassembly: blr

您可以像这样使用 asm.h 文件:

#include "asm.h"
*((volatile int *)(0x80001234)) = ASM_cmpwi_3_0x20;

如果您需要新的 asm 常量,请编辑 input.def 并重新运行 shell 脚本。

关于c - 获取 C 代码中 ASM 指令的字节表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54267768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com