帮助将汇编语言转换为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)
  {
   //...
  }
}