我正在通过实用恶意软件分析一书学习x86,我经常看到类似的内容:
lea edx, [esp+24Ch+name]
push edx
push ...
call ds:bind
我理解LEA是如何工作的,这基本上是在edx中存储esp + 24C + name的值。这可能是指向字符串前面的指针。
我不明白的是编译器如何提出这个问题。这个存储在哪里?这是堆栈中的某个地方吗?如果不是为什么使用esp?
我认为我的程序员在编译器中感觉像是“神奇的数字”时遇到了困难。
答案 0 :(得分:1)
编译器不必使用ebp
作为基址寄存器。它可以决定单独计算堆栈,然后直接使用堆栈指针。在GCC中,您可以使用-fomit-frame-pointer
来实现此优化。
然后,编译器可以生成保持固定大小堆栈或保持计数的代码。取决于功能。