【发布时间】:2020-07-02 10:49:13
【问题描述】:
我正在尝试理解一些汇编代码,以便我可以在 C 中使用它。假设以下 NASM 代码
get_entry_point:
%define STACK_LIMIT 8
%define return_val [ebp-4]
%define base_ptr [ebp-8]
ebp 寄存器是简单地访问函数的参数并将它们存储在base_ptr 和return_val 中,还是在做其他事情?
void __stdcall get_entry_point(unsigned long return_val, unsigned long base_ptr);
关于以下代码
push ebp
mov ebp, esp
sub esp, STACK_LIMIT
pushad
在上面的原型 C 函数中会是什么样子?
【问题讨论】:
-
这段代码看起来像
{ -
@user253751 哈哈,很有趣。可能对代码本身提供更深入的解释?就像我理解代码设置堆栈一样,但这是否是说 C 编译器会自动执行此操作并汇编其手册?但是 %define 符号呢……它假设变量已经在堆栈的 ebp 内……它们是如何开始的?
-
ebp的负偏移量通常是局部变量。这似乎也是这里的情况。STACK_LIMIT是所有变量的大小。[ebp-4]是return_val变量的地址,占栈帧的4个字节。 -
请注意,您的示例并未初始化这两个变量。既没有参数也没有其他任何东西。 (从技术上讲,确切地说,它们的堆栈槽将保存可能从其他函数调用/堆栈用户的先前堆栈帧中遗留下来的伪随机数值。)
-
@ecm 啊,非常感谢 :) 这更有意义!