从汇编语言翻译为C语言的帮助

3

我有一个来自函数的代码

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

代码前面只有'ENTER'命令,之后是一个if语句,如果ebp>eax则返回1,否则返回0。我猜cmpl表示比较,但我无法确定具体的值。有人能告诉我正在发生什么吗?

3个回答

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)阅读cmpl的右操作数,2)阅读跳转指令的第二个字母,3)阅读比较指令的左操作数。因此,在这种情况下:if(%eax小于ebp[12])。这应该有助于您快速阅读代码。 - Mathew Kurian

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)
  {
   //...
  }
}

尝试反汇编上述函数并查看它与你的代码片段有多接近。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接