以下是IDA生成的一段伪代码:
int v13; // eax
int v14; // edx
v13 = a424__legs__ci__set_ci(0.0, v88, v86);
a424__legs__leg__set_ci((int)v116, v13, v14);
在调用a424__legs__leg__set_ci的语句中有3个实参,其中v116已被前面的代码写入过值,v13是前一行调用语句的返回值,但是v14没有被写过。
IDA给出了以下警告:
// 93F104: variable 'v14' is possibly undefined
以下是上述伪代码对应的汇编代码:
.text:0093F0ED push [ebp+var_1318] ; float
.text:0093F0F3 call _a424__legs__ci__set_ci
.text:0093F0F8 add esp, 0Ch
.text:0093F0FB push edx
.text:0093F0FC push eax
.text:0093F0FD lea ebx, [ebp+var_1068]
.text:0093F103 push ebx
.text:0093F104 call _a424__legs__leg__set_ci
以上汇编代码中,传入函数a424__legs__leg__set_ci的第2个参数是eax,第3个参数是edx。即eax对应v13,edx对应v14,这与伪代码中v13和v14的变量定义语句中的注释是一致的。
以下是函数a424__legs__ci__set_ci结尾部分的一段汇编代码:
.text:0042CAD4 loc_42CAD4:
.text:0042CAD4 fstp [ebp+arg_0]
.text:0042CAD7 mov byte ptr [ebp+arg_4], 1
.text:0042CADB mov eax, [ebp+arg_0]
.text:0042CADE mov edx, [ebp+arg_4]
.text:0042CAE1 leave
.text:0042CAE2 retn
由上可知,函数a424__legs__ci__set_ci返回两个值:eax和edx。
IDA生成类C的伪代码,即只把eax作为返回值,不考虑edx的返回。
因此,需要把上述一行伪代码修改为:
v13 = a424__legs__ci__set_ci(0.0, v88, v86, &v14);
还要在a424__legs__ci__set_ci的函数头部增加一个名为out_edx的参数,并在函数体中增加一条语句:
float a424__legs__ci__set_ci_42CA98
(
float arg_0,
unsigned8 arg_4,
float arg_8,
unsigned8* out_edx
)
{
//略
*out_edx = 1;
return arg_8;
}
在Ada语言中,函数或过程的参数有三种模式:in、out、in out。
因此,猜想a424__legs__ci__set_ci的Ada源程序很可能把out_edx定义为是out模式的参数。
1万+

被折叠的 条评论
为什么被折叠?



