帮助从汇编转换为C.

时间:2010-05-06 05:39:15

标签: c assembly x86 translation

我有一些来自函数的代码

subl $24, %esp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax

在代码只是'ENTER'命令之前,如果ebp>之后有一个if语句返回1 eax或0如果它更少。我假设cmpl意味着比较,但我不知道具体的值是什么。谁能告诉我发生了什么?

3 个答案:

答案 0 :(得分:18)

cmpl表示比较(使用4字节参数)。假设这段代码后跟jg <addr>

movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
jg <addr>

然后代码类似于

eax = ebp[8];
if (eax > ebp[12])
   goto <addr>;

答案 1 :(得分:2)

您的代码片段类似于某些处理器和编译器使用的条目代码条目代码是编译器在输入函数时发出的汇编代码。

条目代码负责保存函数参数并为局部变量分配空间并可选择初始化它们。条目代码使用指向变量存储区域的指针。某些处理器使用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)
  {
   //...
  }
}

尝试反汇编上面的函数,看看它与你的代码片段的匹配程度。

答案 2 :(得分:0)

这是(EBP + 8)和(EBP + 12)之间的比较。根据比较结果,cmpl指令设置后续跳转指令使用的标志。

Mac OS X 32 bit ABI中,EBP + 8是第一个函数参数,EBP + 12是第二个参数。