(2.1)--02:第二章堆栈基础和汇编语言.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《(2.1)--02:第二章堆栈基础和汇编语言.pdf》由会员分享,可在线阅读,更多相关《(2.1)--02:第二章堆栈基础和汇编语言.pdf(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章基础知识知识点一:内存区域知识点二:函数调用知识点三:常见寄存器和栈帧知识点四:主要寄存器学习之前,回顾两个问题漏洞是网络安全的源起之地,在软件里为什么BUG会造成如此恶劣影响?编制程序的四个步骤编辑、编译、链接和运行编译检查语法并对单个文件产生可执行程序链接多个可执行文件进行关联(函数调用信息),增加启动程序等如何认识BUG和漏洞BUG就是缺陷,一种表现就是用户部分操作导致程序崩溃,比如输入超长、除以0等程序崩溃就意味着用户的输入会影响程序正常执行,意味着可能通过BUG提供的入口输入构造的恶意程序让程序做非法的事情,因此在安全人眼里,BUG是一种软件漏洞知识点一:内存区域代码区这个区域
2、存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。数据区用于存储全局变量等。堆栈基础内存区域内存区域:一个进程可能被分配到不同的内存区域去执行:堆区进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。栈区用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。在任何操作系统中,高级语言写出的程序经过编译链接,都会形成一个可执行文件。每个可执行文件包含了二进制级别的机器代码,将被装载到内存的代码区;处理器将到内存的代码区一条一条地取出指令和操作数,并送入算术逻辑单元进行运算;如果代码中请求开辟动态内存,则会在内存的堆
3、区分配一块大小合适的区域返回给代码区的代码使用;当函数调用发生时,函数的调用关系等信息会动态地保存在内存的栈区,以供处理器在执行完备调用函数的代码时,返回母函数。堆区和栈区栈(stack)是向低地址扩展的数据结构,是一块连续的内存的区域。栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的默认大小是2M,如果申请的空间超过栈的剩余空间时,将提示overflow。全局数据区|栈区|堆区惯性。X86向低地址扩展;ARM允许自定义堆区和栈区堆(heap)是向高地址扩展的数据结构,是不连续的内存区域,堆的大小受限于计算机的虚拟内存。操作系统有一个记录空闲内存地址的链表,当系统收到程序的
4、申请时,会遍历该链表:寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序;由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间;含义一:物理内存可能不连续含义二:堆区数据分配不连续堆区和栈区的区别栈:由系统自动分配。例如,声明一个局部变量int b,系统自动在栈中为b开辟空间。堆:需要程序员自己申请,并指明大小,在c中malloc函数,如p1=(char*)malloc(10)。申请方式栈
5、由系统自动分配,速度较快,但程序员是无法控制的。堆是由程序员分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。申请效率先向栈区添加了一个变量a,接着向栈区添加了另外一个变量b,则变量a所在的内存地址比变量b所在的内存地址低高不确定相等ABCD提交单选题1分对于如下代码:int*p1=new int200;char*p2=new char30;下列说法正确的是所申请的内存将分配到栈区所申请的内存将分配到堆区P1的值大于p2的值P1的值小于p2的值ABCD提交P1的值和p2的值大小无法确定E多选题2分知识点二:函数调用堆栈基础函数调用函数调用时候将借助系统栈来完成函数状态的保存和恢
6、复。int func_B(int arg_B1,int arg_B2)int var_B1,var_B2;var_B1=arg_B1+arg_B2;var_B2=arg_B1 arg_B2;return var_B1*var_B2;int func_A(int arg_A1,int arg_A2)int var_A;var_A=func_B(arg_A1,arg_A2)+arg_A1;return var_A;int main(int argc,char*argv,char*envp)int var_main;var_main=func_A(4,3);return var_main;在所生成的
7、可执行文件中,代码是以函数为单元进行存储当CPU在执行调用func_A函数的时候,会从代码区中main函数对应的机器指令的区域跳转到func_A函数对应的机器指令区域,在那里取指并执行这些代码区中精确的跳转都是在与系统栈巧妙地配合过程中完成的。每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。当函数返回时,系统栈会弹出该函数所对应的栈帧。那么CPU是怎么知道要去func_A的代码区取指,在执行完func_A后又
8、是怎么知道跳回到main函数(而不是func_B的代码区)的呢?这些跳转地址我们在代码中并没有直接说明,CPU是从哪里获得这些函数的调用及返回的信息的呢?(1)参数入栈将参数从右向左依次压入系统栈中。(2)返回地址入栈将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。(3)代码区跳转处理器从当前代码区跳转到被调用函数的入口处。函数调用的步骤:(4)栈帧调整 保存当前栈帧状态值,已备后面恢复本栈帧时使用。将当前栈帧切换到新栈帧。具体包括:函数栈帧不包括的是局部变量全局变量函数参数返回地址ABCD提交单选题1分一个函数f(int a,int b),在发生对f的函数调用后将开辟函数
9、f的栈帧,其中变量a的地址比变量b的地址低高相等不确定ABCD提交单选题1分知识点三:常见寄存器寄存器(register)是中央处理器CPU的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。我们常常看到32位CPU、64位CPU这样的名称,其实指的就是寄存器的大小。32位CPU的寄存器大小就是4个字节。CPU本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU要用的时候就去内存读写数据。但是,CPU的运算速度远高于内存的读写速度,为了避免被拖慢,CPU都自带一级缓存和二级缓存。基本上,CPU缓存可以看作是读写速度较快的内存。但是,CPU缓存还是不够快,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2.1 02 第二 堆栈 基础 汇编语言
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内