我有一个来自函数的代码
subl $24, %esp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
代码前面只有'ENTER'命令,之后是一个if语句,如果ebp>eax则返回1,否则返回0。我猜cmpl表示比较,但我无法确定具体的值。有人能告诉我正在发生什么吗?
我有一个来自函数的代码
subl $24, %esp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
代码前面只有'ENTER'命令,之后是一个if语句,如果ebp>eax则返回1,否则返回0。我猜cmpl表示比较,但我无法确定具体的值。有人能告诉我正在发生什么吗?
是的,cmpl
意思是比较(使用4字节参数)。假设这段代码后面跟着一个jg <addr>
:
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
jg <addr>
那么代码类似于:
eax = ebp[8];
if (eax > ebp[12])
goto <addr>;
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)
{
//...
}
}
尝试反汇编上述函数并查看它与你的代码片段有多接近。
这是 (EBP + 8) 和 (EBP + 12) 之间的比较。根据比较结果,cmpl 指令设置了标志位,这些标志位被后续的跳转指令使用。
在 Mac OS X 32 bit ABI 中,EBP + 8 是第一个函数参数,EBP + 12 是第二个参数。
%eax
小于ebp[12]
)。这应该有助于您快速阅读代码。 - Mathew Kurian