为什么我写出L写出来的函数L开头的字都有哪些是 push ebp mov ebp,esp 来的函数不是 mov edi,edi push ebp mov ebp,esp

首先你要明白为什么需要使用

以峩的理解函数以ebp用来定位 参数和局部变量

ebp+4指向返回地址

ebp-4指向局部变量一。

那么为什么不使用esp而使用ebp呢因为每一次push pop call等指令都会使得esp的改變(只要有入栈和出栈都会改变esp)

以x86 32位汇编为例子

push eax 指令的本质就是把eax的值压入栈,并且让esp的值减4

pop eax 指令的本质就是把目前esp指向的内存的4字节的值賦值给eax并且让esp的值加4

call 指令的本质是把 返回地址压栈,然后jmp到函数L开头的字都有哪些

以我做反汇编的经验来看,函数执行过程中涉及箌调用另一个函数,会使得esp的值改变而且传参不一定是一次性push完所有参数,中间可能夹带着操作调用者函数的参数或局部变量的指令這时就很难使用esp定位调用者的参数和局部变量了,硬要使用esp定位估计写编译器的准备跑路了。

比如vs2017中的memcpy就不是而是直接使用esp定位参数,换句话说这只是编译器的习惯罢了,为啥要求cpu厂商去兼容一种习惯我哪怕把ebp换成别的寄存器也行。intel新增指令不被人喷死

某程序员:“我编写的程序为什么不能在旧cpu上运行?”

}

推荐于 · TA获得超过793个赞

进入函数時要保存ebp的值

, 然后用来存放进入函数时esp的值,方便进行堆栈内的寻址, 函数返回要恢复ebp的值, 除此以外,ebp

在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义比如:EAX一般用来做返回值,ECX用于记数等等在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP的值达到堆栈平衡的目的。

应用以前说过嘚一段话:

原程序的OEP通常是一开始以 Push EBP 和MOV Ebp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP作为访问堆栈的指针。

为什么要這样呢为什么几乎每个程序都是的L开头的字都有哪些能?因为如果我们写过C等函数的时候就应该清楚程序的开始是以一个主函数main()為开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡而在win32的环境下保持平衡的办法是这样的:

这样做的好处是不用考慮ESP等于多少,PUSH了多少次要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值

函数时esp的值,方便进

以外,ebp和函数返回没什么关系

为什么要这樣呢?为什么几乎每个程序都是的L开头的字都有哪些能因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为開始的而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的:

这样做的好处是不用考虑ESP等于多少PUSH了多少次,要POP多少次了因为我们知道EBP里面放的是开始时候的ESP值。

PASCAL是一种函数调用的方式确定参数压栈的顺序,还有由谁来恢复堆栈具体的可以看下下面的链接。还有这里:


下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 L开头的字都有哪些 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信