帮助将汇编语言转换为C语言
我有一些函数的代码帮助将汇编语言转换为C语言,c,assembly,x86,translation,C,Assembly,X86,Translation,我有一些函数的代码 subl $24, %esp movl 8(%ebp), %eax cmpl 12(%ebp), %eax 在代码之前只是“ENTER”命令,之后是if语句,如果ebp>eax,则返回1;如果ebp>eax,则返回0。我假设cmpl意味着比较,但我不知道具体值是什么。有人能告诉我发生了什么吗?是cmpl表示比较(使用4字节参数)。假设这段代码后面跟着一个jg: movl 8(%ebp),%eax cmpl 12(%ebp),%eax jg 那么代码类似于 eax = eb
subl $24, %esp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
在代码之前只是“ENTER”命令,之后是if语句,如果ebp>eax,则返回1;如果ebp>eax,则返回0。我假设cmpl意味着比较,但我不知道具体值是什么。有人能告诉我发生了什么吗?是
cmpl
表示比较(使用4字节参数)。假设这段代码后面跟着一个jg
:
movl 8(%ebp),%eax
cmpl 12(%ebp),%eax
jg
那么代码类似于
eax = ebp[8];
if (eax > ebp[12])
goto <addr>;
eax=ebp[8];
如果(eax>ebp[12])
后藤;
这是(EBP+8)和(EBP+12)之间的比较。根据比较结果,cmpl指令设置以下跳转指令使用的标志
EBP+8是第一个功能参数,EBP+12是第二个参数 您的代码片段类似于某些处理器和编译器使用的条目代码。输入代码是编译器在输入函数时发出的汇编代码 输入代码负责保存函数参数,为局部变量分配空间,并可选地初始化它们。输入代码使用指向变量存储区域的指针。一些处理器使用EBP和ESP寄存器的组合来指向局部变量(和函数参数)的位置 因为编译器知道变量(和函数参数)存储在哪里,所以它会删除变量名并使用数字索引。例如,行:
movl 8(%ebp), %eax
将第8个局部变量的内容移动到寄存器EAX
,或将8字节处的值从局部区域开始移动(假设EBP
寄存器指针指向局部变量区域的开始)
指示:
subl $24, %esp
表示编译器在堆栈上保留24个字节。这可能是为了保护函数调用约定中的某些信息。该函数将能够在此之后将该区域用于自己的用途。此保留区域可能包含函数参数
您提供的代码片段看起来像是在比较函数中的两个局部变量:
void Unknown_Function(long param1, long param2, long param3)
{
unsigned int local_variable_1;
unsigned int local_variable_2;
unsigned int local_variable_3;
if (local_variable_2 < local_variable_3)
{
//...
}
}
void Unknown_函数(长参数1、长参数2、长参数3)
{
无符号整数局部变量;
无符号整数局部变量;
无符号整数局部变量3;
if(局部变量2<局部变量3)
{
//...
}
}
尝试反汇编上述函数,看看它与代码片段的匹配程度 对于那些想快速作弊的人。按以下顺序执行:1)读取cmpl的右操作数,2)读取跳转指令的第二个字母,3)读取比较指令的左操作数。所以在这种情况下:如果(
%eax
小于
)。应该可以帮助您快速阅读代码
void Unknown_Function(long param1, long param2, long param3)
{
unsigned int local_variable_1;
unsigned int local_variable_2;
unsigned int local_variable_3;
if (local_variable_2 < local_variable_3)
{
//...
}
}