标签:进程 操作 等于 alt src 虚拟 图片 c语言 数组遍历
一,预备知识:
1,堆栈
应用:函数调用(先进后出),数组遍历,表达式计算
2,寄存器
寄存器是是cpu中临时存储数据的地方,非常小,但是非常快。cpu进行计算时,cpu不能直接对内存中的两个数据进行操作。他必须先装入寄存器中,然后才进行加减等操作。
我们最常用的是AX,BX,CX,DX。它们都是16位的。现在都扩展到了32位。低位(0-15)有时候运算用不了这么多,所以低位可以拆分为 高位AH(8-15),低位AL(0-7)。
A,B,C,D都是通用的寄存器,在进行数据处理时,可以用。
ESI(source),EDI(destination)在拷贝数据时用到,
ESP:永远指向栈的栈顶
EBP:描述了一个栈帧,EBP永远指向一个栈帧的开始处
3, 汇编
4,指针
指针就是内存地址。
二,例子:
C语言代码
再看程序的机器表示(汇编):
进程的虚拟地址空间
函数帧:
每个函数都有栈帧,里面存放上一个栈帧的地址,输入参数,返回值等
地址由大到小,如果满了,就会出现堆栈溢出。
寄存器的理解
EBP:是一个寄存器,里面存一个值,这个值是指向内存中的当前函数栈帧的开始处(指向函数帧2的开始处,函数帧2是当前栈帧)。
但是函数帧1的的开始处怎么存呢?因为只有一个ebp,所有的函数帧开始地址都要存放在ebp中。那么可以把所有的函数帧开始地址压到栈中
ESP:是一个指向栈顶的寄存器,每次做push操作,esp会自动减(栈向下生长)。调用pop操作,esp自动加(栈收缩)。注意:栈是从上往下生长的。栈地址是从大往小生长的,栈底是在最上面的。
理解:
每个函数调用都会生成栈帧。是动态生成的。函数中的变量,比如:Int a =10;可以在编译时就分配好内存。所以是静态的。
malloc是堆,运行时才分配出内存。所以是动态的。
pushl %ebp :把ebp中的值(1000)放到栈顶(内存中),此时esp自动减4(804减到800)。
movl %esp %ebp:把esp中的值放到ebp中(ebp由1000变为800),所以现在esp的值等于ebp的值
subl %24esp:把栈顶esp的值减24,如图:
标签:进程 操作 等于 alt src 虚拟 图片 c语言 数组遍历
原文地址:https://www.cnblogs.com/inspred/p/10747777.html