我正在将一个旧视频游戏从 MIPS 汇编程序反编译为 C。调试符号使其进入零售版本,所以我知道有哪些功能,存在哪些全局和局部变量,以及数据结构是什么样的。
有一个结构体,其中有一个字符数组作为其成员,名为 actfree。它似乎是一个通用成员,用于存储额外的状态信息。
我多次注意到一条指令从数组中加载一个字或半字以用于比较或传递给函数。例如,加载半字以将 short 传递给函数。
问题是,原来的 C 会是什么样子?
不可能在 C 中传递数组的一部分,所以我最接近的是从数组中传递两个字符作为一个短的是:
myFunction(myStruct->actfree[12] | (myStruct->actfree[13] << 8));
为了比较,我只需要为每个索引重复测试:
if (char1 != 0 && char2 != 0 && char3 != 0 && char4 != 0
不过,我不是 C 向导。有人有更好的主意吗?
可能是你有一个结构,而不是数组。
在下面的程序中,
s.w
成为
movzx eax, WORD PTR [rbp-2]
那是在 x86-64 上,但是 MIPS 的编译器也可以做同样的事。
程序:
#include <stdio.h>
#include <inttypes.h>
struct S {
char a[12];
uint16_t w;
};
void f( uint16_t w ) {
}
int main( void ) {
struct S s = { 0 };
f( s.w );
}