我正在拆解运行在 Intel i960 处理器上的游戏。我的反汇编正处于我想尝试从 IDA Pro 生成的 ASM 文件重新组装它的时候。ASM 文件需要对 binutils 2.16.1a i960-coff 目标汇编程序稍加操作才能工作,但是似乎有一条指令,要遵循类似的指令,但汇编程序在此指令之后出现段错误,无法重新组装。
指令如下:“stt r12,(g11)[g12]”
可以在此处找到显示默认错误的 switch 语句的 git 。我的一位同事解释说,围绕比例字段的错误是因为比例因子不是 1、2、4、8 或 16。比例因子只有三位,他假设这很可能是 Register Indirect with索引形式。
来自编程手册:
st、stl、stt 和 stq 指令将 4、8、12 和 16 个字节从连续寄存器复制到内存中。... 使用加载 (ld)、加载长 (ldl) 和加载三重 (ldt) 指令将浮点值从内存加载到全局或本地寄存器中。同样,全局或本地寄存器中的浮点值使用存储 (st)、存储长 (stl) 和存储三重 (stt) 指令存储在内存中。... st、stl、stt 和 stq 指令分别从连续的寄存器复制 4、8、12 和 16 个字节到内存。对于 stt 指令,src 必须指定偶数编号的寄存器(例如,gO、g2、...、gI2)。对于 stt 和 stq 指令,src 必须指定一个 4 的倍数的寄存器编号(例如,g0、g4、g8)。
然而,我有一种感觉,它可能是一个带有索引和位移的寄存器间接。原因是该指令也可以反汇编为 ""stt r12, (g11)[g12*1]" 并且手册列出了带有索引和位移的寄存器间接示例在汇编语法中:
exp (reg) [reg*scale]
但如果是这种情况,比例将是 1。我有点不知所措,并希望挑选逆向工程堆栈交换的想法,看看可能会出现什么信息。可能只是游戏公司有自己的汇编程序和对处理器的特殊知识,但并未公开或发布。