公司网站本地如何弄,镇江网站建设镇江,百度官方网站网址是多少,公司网站建设记哪个科目PS#xff1a;EBP是当前函数的存取指针。即存储或者读取数时的指针基地址#xff1b;ESP就是当前函数的栈顶指针。每一次发生函数的调用#xff08;主函数调用子函数#xff09;时#xff0c;在被调用函数初始时#xff0c;都会把当前函数#xff08;主函数#xff09;… PSEBP是当前函数的存取指针。即存储或者读取数时的指针基地址ESP就是当前函数的栈顶指针。每一次发生函数的调用主函数调用子函数时在被调用函数初始时都会把当前函数主函数的EBP压栈以便从子函数返回到主函数时能够获取EBP。 以下是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码 如果运行函数前堆栈指针ESP为0xAAAAAAA 。EBP为0xAAAAAB0 push p2 ;參数2入栈, ESP - 4h , ESP 0xAAAAAAA - 4h 0xAAAAAA6 push p1 ;參数1入栈, ESP - 4h , ESP 0xAAAAAAA - 8h 0xAAAAAA2 call test ;压入返回地址 ESP - 4h, ESP 0xAAAAAAA- 0Ch 0xAAAAA9D,注意这里是test函数的返回地址。即在代码段中的地址偏移。 ;//进入函数内 { push ebp ;保护先前EBP指针 EBP入栈(即0xAAAAAB0入栈。注意与返回地址差别) ESP-4h, ESP 0xAAAAA99 mov ebp, esp ;设置EBP指针指向栈顶 0xAAAAA99 mov eax, dword ptr [ebp0ch] ;ebp0ch为0xAAAAAA6即參数2的位置 mov ebx, dword ptr [ebp08h] ;ebp08h为0xAAAAAA2,即參数1的位置 sub esp, 8 ;局部变量所占空间ESP-8, ESP 0xAAAAA91 ... add esp, 8 ;释放局部变量, ESP8, ESP 0xAAAAA99 pop ebp ;出栈,恢复EBP, ESP4, ESP 0xAAAAA9D,即把栈中地址0xAAAAA9D的内容pop到ebp中 ret 8 ;ret返回,弹出返回地址,ESP4, ESP0xAAAAAA2, 后面加操作数8为平衡堆栈,ESP8,ESP0xAAAAAAA, 恢复进入函数前的堆栈. } 看完汇编后,再看EBP和ESP的定义,哦,豁然开朗, 原来ESP就是一直指向栈顶的指针,而EBP仅仅是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数參数、局部变量等。