Assembly 使用x86程序集获取EIP的值
的公认答案给出了以下解决方案:Assembly 使用x86程序集获取EIP的值,assembly,x86,Assembly,X86,的公认答案给出了以下解决方案: get_eip: mov eax, [esp] ret 但我不明白为什么会这样。为什么已保存的EIP由ESP指向?执行mov指令时,ESP不应该指向SFP(旧的EBP值)吗?x86程序集中子程序调用的序言如下所示: push ebp ; Save the old base pointer value mov ebp, esp ; Set the new base pointer value sub esp, ... ; Make
get_eip: mov eax, [esp]
ret
但我不明白为什么会这样。为什么已保存的EIP
由ESP
指向?执行mov
指令时,ESP
不应该指向SFP
(旧的EBP
值)吗?x86程序集中子程序调用的序言如下所示:
push ebp ; Save the old base pointer value
mov ebp, esp ; Set the new base pointer value
sub esp, ... ; Make room for local variable
因此,保存的
EIP
不应该在ESP
指向的地址上方多放一个字吗?是的,但是您可以看到这个函数没有这样的序言。@Jester是没有局部变量或其他东西的函数的一个例外…?这个序言是可选的,通常不用于优化代码。您只需要子esp
来分配局部变量。@ZizhengTai没有强迫您添加子例程序言,正如您所看到的,get\u eip
函数没有这样的序言。@fuz哦,我明白了。序言是针对用高级语言(例如C/C+)编写的函数。我们可以随心所欲地编写汇编函数。