我有一个正在修补的已编译 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 处,因此调用指令只是将位移添加到程序计数器而不是调用绝对地址.