程序存储器分段

程序存储器分为:text,data,bss,heap,stack

text:代码段,存储汇编后程序机器语言指令,该段内执行是非线性的。text段禁用写权限。

data:存储程序运行过程中要使用的全局变量,字符串和其他常量。

bss:存储未初始化的内容。

heap:heap段的大小是可变的。heap段中的所有存储单元又配器和回收器算法管理。分配器在堆中预留一部分区域,回收器取消预留的存储器,使该区域可以被下一次预留重新使用。堆从存储器的低地址向高地址增长。

stack(先进后出):stack段的大小是可变的。stack段用作中间结果暂存器来存储断点信息。当一个程序运行时,函数将有它自己的传递变量集,并且函数的代码会在文本段(代码段)的不同存储单元内。函数调用时,程序的运行环境和EIP必须改变,堆栈存储所有被传递的变量,以及函数执行后EIP应该返回的地方。数据被存入堆栈中时成为压栈(Push),数据取出被称为出栈(POP).

void test_function(int a,int b,int c,int d)
{
char flag;
char buffer[10];
}

void main()
{
    test_function(1,2,3,4);
}

这一段代码声明了一个具有4个参数的test函数。

当主函数调用时,值被压入堆栈以创建下述堆栈帧。当调用test_function()时,逆序将函数压入堆栈,函数的参数是1,2,3,4,因而随后的压栈指令压入4,3,2,1.

当汇编call执行执行时,为了将执行环境变成test_function(),返回地址被压入堆栈。这个值是紧跟在当前EIP之后的那一条指令。

紧随返回地址的是帧指针,这个值用来恢复EBP原来的值。然后,把ESP的值复制到EBP中。

当函数调用时,EIP的值被修改为函数在代码段中的首地址,以执行函数。

函数执行结束时,EIP被设置为返回地址。

原文地址:https://www.cnblogs.com/98Lucifer/p/8893743.html

时间: 2024-08-30 13:14:08

程序存储器分段的相关文章

(转)存储器分段和地址计算

存储器分段和地址计算 1. 存储单元的地址和内容     在8086 CPU系统中,以字节为单位线性地组织存储器.一个字节就是一个 存储单元,为了标识和访问每个存储单元,给每个存储单元规定一个编号,即 存储单元的地址     存储单元的地址用二进制无符号数表示,从0开始,顺序加1,则n位二进制 数可以表示2^n个存储单元的地址.     一个存储单元中存放的信息称为该存储单元的内容.当将一个字存放到存 储器时需要占用两个连续的字节,系统规定:把一个字存放到存储器时,低字节 存放在地址较低的字节单

内存管理--分发您的程序存储器

在一个多任务操作系统的每个进程在其自己的沙箱的存储器执行.沙盒是一个虚拟地址空间(virtual address space). 1 32位虚拟内存布局 在32下部模式虚拟地址空间始终是一个4GB内存地址块.这些虚拟地址的页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用. 每个进程拥有一套属于它自己的页表,可是另一个隐情. 仅仅要虚拟地址被使用,那么它就会作用于这台机器上执行的全部软件.包含内核本身.因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味着内核使用

第四节、程序的机器语言

一.x86的历史观点 x86架构于1978年推出的Intel 8086中央处理器中首度出现,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的.8086在三年后为IBM PC所选用,之后x86便成为了个人计算机的标准平台,成为了历来最成功的CPU架构. 二.程序编码 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. 对于机器级编程来说,其中两种抽象尤为重要: ①.指令集体系结构(Instruction set archi

汇编语言从入门到精通-CPU资源和存储器

CPU资源和存储器 在汇编语言中,需要访问的硬件资源主要有:CPU内部资源.存储器和I/O端口.本章将着重讲解CPU内部寄存器的命名.功能及其常见的用途,还要介绍存储器的分段管理模式.存储单元地址的表示法以及其物理地址的形成方式. 2.1 寄存器组 寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一.由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能. 寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结

汇编语言--CPU资源和存储器(二)

二.CPU资源和存储器 需要访问的硬件资源主要有:CPU内部资源.存储器和I/O端口. 1.寄存器组 (1)16位寄存器组 16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) 4个段寄存器(ES.CS.SS和DS) 1个指令指针寄存器(IP) 1个标志寄存器(Flags) (2)32位寄存器组 32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器.指令指针和标志寄存器从

让cpu运行程序(四)

如何编译汇编程序 这个汇编程序的编译对我们设计的CPU来说非常简单.按照我们设想的CPU中,程序存储器.数据存储器是分开的.因此,不用考虑程序和数据的混淆问题.此外,由于我们设想的指令系统是一条指令就占一个存储单元,所以标号的地址非常容易计算出来.如果我们确定了第一条指令存放的地址,那么从这条指令向后数数,就可以将标号确定下来. 对于变量在什么地方的问题,常常是一般作汇编程序设计的人较为迷惑的问题.产生迷惑的原因主要是我们自己不作变量地址分配.做为一个CPU 的设计者,不仅要对程序如何放入内存进

《深入理解计算机系统》3.2程序编码

程序编码 在Unix机上使用命令 编译代码 优化编译的等级越高,编译时间越长,程序性能越高 机器级代码 对于机器级编程,两种抽象尤为重要 第一种 机器级程序的格式和行为(ISA指令集体系结构) 第二种 机器级程序使用的存储器地址是虚拟地址 机器级代码把存储器看成一大块数组罢了 汇编代码案例 具体的代码作用是后面章节才讲的 学完寄存器和栈后才画出的图,书上某些部分例子没有讲全,搜了很多资料,可能这些部分是再靠后的章节才讲 相关资料链接 http://www.cnblogs.com/jiu0821/

让cpu运行程序(二)

简单汇编指令设计 用文字符号书写的计算机指令就是汇编指令.这种汇编指令遵照怎样的格式书写,才能够和我们要设计的机器指令一一对应起来?做为CPU 的设计者在设计指令系统的同时,必须要考虑好这方面的问题.考虑好机器指令的格式,进而要考虑好汇编指令如何与之对应. 如何设计机器指令格式? 指令格式是指令分析执行的基础,按照一定的指令格式编写的指令,才能够让CPU分析出是哪一条指令,这条指令要做什么动作,以及如何去动作.为了能够分析执行指令,一般CPU都要专门设置一个指令寄存器,这个寄存器要放置从程序存储

程序的机器级表示——基础

计算机执行的是机器代码,机器代码是二进制文件,既程序.机器代码用字节(1Byte=8bit)序列编码低级的操作,例如数据处理,管理存储器,从存储设备取数据等.使用高级语言(c,c++等)编写的程序(文本形式)最终需要被编译成机器代码才可以被计算机执行.当使用GCC c编译器来编译c语言代码时,会首先将其编译成汇编语言形式的内容,然后c编译器调用汇编器和连接器来最终形成计算机可执行的机器代码.汇编语言代码是机器码的文本形式,是机器码(字节序列)的文本助记形式.现在的要求是可以理解经过编译器优化过的