GNU 汇编器 - Tricore - 如何设置原点?

逆向工程 部件 重新组装 称呼
2021-07-05 15:05:58

我有一个正在修补的已编译 Tricore 二进制文件。通过从函数的 IDA Pro 创建一个 .asm 文件并重新格式化它,除了调用(相对)和跳转(相对)指令之外,我可以让它忠实地重新组装。这样做的原因之一是,汇编器会自动重新计算程序计数器的偏移量,以用于重定位代码中的相对跳转和调用。

失败是因为 .org 0x80280000 没有像我希望的那样工作,并且 a.out 文件的基址为 0x0,因此无法从该地址访问调用和 j。我不想将代码更改为绝对愈伤组织。

这失败了:

.org 0x80280000
call 0x8027024C
j    0x80292420

orgtest1.s:汇编消息:

orgtest1.s:2:错误:操作码/操作数不匹配:调用 0x8027024C

orgtest1.s:3:错误:操作码/操作数不匹配:j 0x80292420

这失败了:

call 0x8027024C
j    0x80292420

orgtest1.s:1:错误:操作码/操作数不匹配:调用 0x8027024C

orgtest1.s:2:错误:操作码/操作数不匹配:j 0x80292420

这成功了:

call 0x7024C
j    0x92420

问题不在于指令是非法的(并且跳转到较低的地址是合法的),而是我无法找到一种方法来告诉汇编器来源在哪里。

我不知道这是否是 GNU AS 的预期行为?我读到它无法计算低于 .org 的地址,实际上,如果我将 .org 设置为 0x8000 并调用 0x2404,它最终会在 0xA404 处,因此调用指令只是将位移添加到程序计数器而不是调用绝对地址.

0个回答
没有发现任何回复~