如何让CodeWarrior编译C代码生成小数据加载指令匹配PS2原汇编
PS2调试版游戏反编译:数组初始化汇编不匹配问题
我正在反编译一款以调试版发布的PS2游戏,为验证手写C代码与原代码一致,使用对应版本的Metrowerks CodeWarrior编译器(MW MIPS C Compiler (2.4.1.01).PlayStation2)编译后反汇编ELF文件进行对比。目前整体已接近完全匹配,但局部数组的初始化汇编仍未对齐。
原游戏中的对应汇编代码:
lui a3,hi(@113+259) addiu a3,a3,lo(@113+-12800) addiu a2,sp,160 li a1,4 lw a0,0(a3) lw v1,4(a3) addiu a3,a3,8 addiu a1,a1,-1 sw a0,0(a2) sw v1,4(a2) addiu a2,a2,8 bgtz a1,*-28
这段汇编对应函数顶部的C代码:
int_union* patsettbl[8] = { 0, &scra_h_posit, &scrb_h_posit, &scrc_h_posit, 0, &scra_v_posit, &scrb_v_posit, &scrc_v_posit };
但我编译后得到的汇编代码如下:
lui v1,hi(@112+259) addiu v1,v1,lo(@112+-13568) addiu a1,sp,160 lq a0,0(v1) lq v1,16(v1) sq a0,0(a1) sq v1,16(a1)
可见编译生成的汇编使用大数据块加载指令初始化数组,而非原汇编中的循环加载小数据指令。我已关闭所有优化,请问哪里操作有误?
内容的提问来源于stack exchange,提问作者user16316067
相关产品推荐
相关产品推荐

