[汇编x86(i386) nasm] 三种内存模型:实模式平面模型,实模式段模型,保护模式平面模型...

  “学好汇编语言的诀窍在于对其内存模型的理解,只有傻子才只学习机器指令”    ————《汇编语言--基于Linux环境》

  ok,懂了吧?要学汇编必须先会内存模型(✿◕‿◕✿)。

三种内存模式

  三种内存模式分别为:实模式平面模型,实模式段模型,保护模式平面模型。其中保护模式平面模型是目前最常用到的(Windows 2000及以上/Linux)的内存模型,其他两种了解一下即可以了。

       1).实模式平面模型

     实模式平面模型是最古老的内存模型,Intel 8080 上面跑的程序即采用这种模型,8080是8位CPU,拥有16位地址引脚,这意味着它能寻到2^16=64K个字节,既然是实模式模型,就意味着程序员可以随意访问这64K的内存,因此汇编程序员在编程时必须小心翼翼,防止将有用的数据破坏了。8080主要使用的操作系统是CP/M-80,它安装在内存空间的顶部,这样做是为了让程序让其它程序有一个一致的起点的:当CP/M-80从磁盘读入一个程序并运行时,它将程序加载在距离内存底部256个字节的地址为0100H的地方。内存的前256个字节叫做程序段前缀(Program Segment Prefix,简称PSP),里面包含着一些零碎信息和一个用于程序磁盘输入输出的通用内存缓存区。可执行程序本身一开始并不执行,直到系统对0100H开始寻址。

        下图为:8080下的内存模型

8086内存模型

对于实模式平面模型更标准,更清楚一点的表述,是这样的:

      

    2)实模式段模型

     8080的内存模式非常简单,并且当Intel创建它的第一个16位CPU——8086时,人们便把8080较老的CP/M-80上的CPU移植到8086,因为8086有20位的地址引脚,能寻址2^20=1M的内存空间,这相当于16倍的8080CPU,因此,可以将8086分为16个区域,每个区域只占用64K的内存空间,就好像它是小型的8080内存系统一样,这样,来自CP/M-80系统的软件便能够在8086中运行了。但是要用到那一块内存空间呢?这时一个寄存器便应运而生了:段寄存器CS,它用来存储代码段的内存信息,由此,段模型就产生了。


  

  从短期来看,这是明智之举,但从长期来看,这变得很糟糕:因为大规模地使用,使得段模型控制了8086的体系结构。这使得一些一些需要超过64K的程序不得不使用64K的内存块,通过改变段寄存器的值来实现在这些内存块的切换,这就是实模式下段内存模型。

对实模式段模型,若并非是来自8080的移植程序,更清楚地表述是这样的:

    

     提示:通过dosbox模拟出的CPU是8086并且是采用虚拟X86技术模拟出的,它能够在保护模式下模拟出一块8086处理器,如果你在DOSBOX学习汇编,便是实模式分段模型。

    3).保护模式平面模型 

     保护模式下的内存模型就没有那么理解了,因为它牵扯到了额外的知识:物理地址,虚拟地址,这两个概念如果你学过操作系统原理的话自不必说,将很好理解,如果没有学过的话,请现在停止阅读,去Google一下,了解明白了再转回来继续。

     简而言之,虚拟内存是一个“系统”,可以根据它将一个更大的内存空间“映射”到磁盘存储器中,当程序运行时,它将得到一个4GB大的地址空间来施展拳脚,任何一个32位寄存器仅凭自己就能访问这4GB地址空间,因为2^32=4GB,理解这就够了。要注意的是,并非所有的4GB空间你都有权利访问,有些内存空间非但不能修改,甚至连访问都不能访问,因为这些内存空间是受操作系统保护的,因此保护模式“保护”二字才实至名归。运行的操作系统不同,具体内存空间的情况也不一样。

      此外,在保护模式下,段寄存器仍然存在,但是它们以一种完全不同的方式工作,因为它们现在被认为是操作系统的一部分,普通的程序无法访问它们并且无法对它们进行修改:关于段的一切都交给操作系统去做吧!

      比较一下实模式平面模型和保护模式平面模型,可以看到,在实模式下,你的程序拥有交给它的整个64KB内存空间,在保护模式平面模式下,你将得到分给自己的4GB的一部分空间,而其它部分仍属于操作系统。此外,在保护模式下,一个通用寄存器可以存放其4GB空间的任意地址,但是在访问一些受保护的内容时,会触发运行时错误。

保护模式下的平面模型是这样的:

 

转载于:https://www.cnblogs.com/ananananan/articles/10334844.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值