pandas column,python中columns函数的使用
在你理解函数栈框架之前,你需要知道基本的概念。首先,请参考博客,了解程序编译阶段发生了什么。程序环境和预处理
总而言之,编译过程的最终产品是可执行程序3354,它由一系列机器语言指令组成。当程序运行时,操作系统将这些指令加载到计算机的内存中,所以当生成每条指令都有特定的内存地址可执行程序时,程序就变成了机器识别的二进制代码。还有,我需要知道内存的分区。
我们今天讨论的函数堆栈框架主要在堆栈区。和栈区的结构是从高地址到低地址开辟空间
我知道一些元件的基本符号。
基本寄存器:
esp:总是指栈顶空间。
ebp:用于记录堆栈中的地址,始终指向系统堆栈顶部的堆栈帧底部。
eax/ebx/ecx/edx:这些寄存器就像容器,存储一些值,知道一些编译指令。
1.mov esp,ebp mov这里指的是将ebp的值代入esp ——,即右值入左。
2.pop edi在这里,栈顶的元素先堆栈,然后赋给寄存器edi。
3.这里的Push ecx是把ecx的值推到栈顶
4.dword ptr [address]表示由该地址指向的4字节数据,
5.rep stos dword ptr es:[edi]表示eax覆盖从edi开始的内存,edi减4。循环ecx次。
6.sub esp,0E4h这里是esp减0E4h(十六进制)
选择一个相对简单的函数调用,从汇编级观察函数栈区域上方的创建。
# includesdio . hint add(intx,int y){ return x y;(} int main)){ int a=10;int b=20int c=0;c=add(a,b);0;}调试功能,转反汇编
这是add函数的汇编代码。如下一步一步读。
http://www。Sina.com/Here,首先将ebp推到堆栈上。此时,esp也指向ebp,因为esp总是指向栈顶。把http://www.Sina.com/esp的值代入ebp,所以ebp也指向栈顶。
http://www。Sina.com/: esp减0E4h,即0e4hhttp://www.Sina.com/:EBX, ESI和edi,被推送到堆栈上。因为esp总是指向栈顶330,所以必须一个一个上升。
写-3358 www.sina.com/register ecx第一步:注册eax -http://www。Sina.com/ccccccccch进入注册EAXhttp://www。Sina.com/.
因为edi中存储的内存地址是ebp-0E4h,0E4h的十进制值是228,循环数ecx 39h是57十进制。但是,由于228是57的4倍,所以这个命令意味着将ebp到ebp-0E4h的每4个字节的空间复制到eax的值,即0ccccccccccch。
填充cc cc cc cc这里没有保存在中间的其实是我们有时候在越界访问内存时看到的打孔烫发…
在-http://www.Sina.com/:ebp-8的位置替换0Ah,输入14h10十进制20或B值http://ww。新浪在十进制10的位置还是一个值http://www。Sina.com/:ebp-14h.
http://www.Sina.com/:的前两行先把ebp-14h的值压入寄存器eax,后两行先把ebp-8h的值压入寄存器ecx,再把ecx压入堆栈。
这里称为函数参数,它将函数传递给创建的临时变量。
在这里调用add函数。Call是访问add的内存地址。但需要注意的是,add访问函数的地址时,是从第二步:开始的
按f11进入功能内部。
跳转到函数的代码程序集
现在开始访问add函数的内部!
该函数的堆栈框架与创建主函数时的堆栈框架相同,这里省略创建函数堆栈框架的具体步骤。
这是
夹在寄存器esp和ebp之间的区域是add的函数栈框架。
第一步:将ebp 8指向的值(即传入参数10)存储在寄存器eax中。第二步:将ebp-0Ch指向的值(即传入参数20)加到寄存器eax,然后寄存器eax存储30。
第一步:这里分别从堆栈第二步中取出寄存器EDI ESI ebx:esp的地址加上0C0h,是初始化时esp减去的大小,所以此时esp和ebp指向同一个空间。
第一步:将ebp的值赋给esp第二部:弹出堆栈顶部的元素并将其赋给ebp。注意:这里栈顶存储的ebp实际上是主函数栈帧ebp指向的ebp的地址。
这时候就该返回了,也就是add函数完成,主函数返回。
但是return main函数不知道从哪条指令开始,所以这里有一个函数,将调用的下一条指令存储在函数栈框架中,这样在函数被调用后仍然可以找到下一条指令。事实也是如此:
第一步:在esp的地址上加8,由于每个地址都是四个字节,也就是下移两位数第二步:将我们在add中得到的返回值eax赋给ebp-20h,C所在的地址空间第二步将返回值成功的带回了主函数!。
main函数的销毁和add函数的销毁完全一样,这里就不赘述了。
总结:函数栈框架让我们充分意识到函数建立的过程包括:
函数的参数如何传入函数:函数堆栈框架上复制到临时变量的返回值如何传回主函数:存储在寄存器中,带回主函数,不考虑参数和函数中创建的临时变量(输出函数会被销毁)。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。