eip $pc 下一个要执行的指令地址
esp 栈指针
ebp 桢指针
eax,edx,ecx 寄存器需要调用者负责保护(保存),就是通过入栈来保存
ebx,esi,edi 寄存器需要被调用者负责保护(保存)
在x86体系结构上,本运行模块的GOT表首地址始终保存在%ebx寄存器中
--------------------------------------------------------------------------------------------------------------
push ebp //ebp入栈,esp-4
mov ebp,esp //ebp = esp
and esp,-16 //栈空间16字节对齐
sub esp,32 //esp = esp-32,为栈分配32个字节
mov [esp],eax //把eax的值写入到[esp],前面已经预留了空间(对齐16,预分配32,一共48个字节)
call test //call等价于push eip,jump func_addr 把返回地址入栈,再跳到test函数地址
mov eax,0 //函数返回值
leave //等价于mov esp,ebp 再pop ebp
ret //把返回值出栈,并赋值给eip
------------------------------------------------------------------------------------------------------
本文深入解析了x86体系结构中函数调用的过程,详细阐述了寄存器的作用与职责,包括eip、esp、ebp、eax、edx、ecx、ebx、esi、edi的功能。同时介绍了在x86体系结构下如何通过pushebp、movebp、andesp、subesp、mov、call、leave、ret等指令实现函数调用与返回的细节。
369

被折叠的 条评论
为什么被折叠?



