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

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

_________________________00000H   
    |    ......        |
    |_______________________|33450H
    |    34H        |
    |_______________________|33451H
    |    12H        |
    |_______________________|33452H
    |    56H        |
    |_______________________|33453H
    |    29H        |
    |_______________________|
    |    ......        |
    |_______________________|

这种存储原则称为“高高低低”原则。对于由四个连续字节构成的双字单元,
也使用同样的原则,例如地址33450H的双字单元中存放着数据29561234H。

2. 存储器的分段
    8086 CPU有20根地址线,可直接寻址的地址空间为2^20=1M字节,即存储单元
的物理地址是20位的二进制无符号数,范围为00000H~FFFFFH。
    但是,8086 CPU内部的算术逻辑单元只能进行16位运算,而且存放存储单元
地址偏移的指针寄存器(SP、BP、SI、DI、BX)均为16位,无法直接寻址1MB物理
地址。为此,把1MB地址空间划分成若干逻辑段,每个逻辑段满足如下条件:
    (1)逻辑段的开始地址必须是16的倍数——与段寄存器长16位有关
        即逻辑段的起始地址最后四位必定为0000
    (2)逻辑段的最大长度为64K——与指针寄存器长16位有关

3. 物理地址的计算
    根据存储器的逻辑分段,如何计算实际的物理地址?很明显,逻辑段的起始
地址是16的倍数,即逻辑段的起始地址均具有如下形式:
        xxxxxxxxxxxxxxxx0000B = XXXX0H
    这种段起始地址可以压缩为XXXXH,称为段值,即段起始地址等于段值成语16。
    而要访问的存储单元总属于某个段,将存储单元地址与所在段起始地址的差
称为段内偏移,简称偏移。在给定段内,通过偏移完全可以确定要访问的存储单元,
因此在整个1MB地址空间中,
        存储单元的物理地址 = 段起始地址 + 段内偏移
                           = 段值 × 16 + 段内偏移
                           = 段值 : 偏移    (简化表示)

采用“段值:偏移”构成逻辑地址后,段值由寄存器给出,偏移可以由指令指针IP、
堆栈指针SP、以及其它可用作存储器指针的寄存器(SI、DI、BX、BP)给出、或者直接用
16位数给出。指令中不使用物理地址,而使用逻辑地址,由CPU的总线接口单元BIU根据
段值和偏移自动计算出物理地址。

4. 段寄存器的引用
    8086 CPU有四个段寄存器,可保持4个段值,故可同时使用4个段,但四个段各有分工。
每当需要生成物理地址时,BIU会自动引用特定的段寄存器来计算物理地址。
    (1)取指令时,BIU自动引用代码段寄存器CS,再加上指令指针IP的16位偏移,得到
         指令的物理地址;
    (2)当涉及堆栈操作时,则自动引用堆栈段寄存器SS,再加上SP的16位偏移,得到
         堆栈操作所需的物理地址;当偏移涉及BP寄存器时,默认引用的段寄存器也是
         堆栈段寄存器SS;
    (3)在存取存储器中的操作数时,自动选择数据段寄存器DS或附加段寄存器ES,再
         加上16位偏移,得到操作数的物理地址。此时的16位偏移,可以说包含在指令
         中的直接地址,也可以是某个16位存储器指针寄存器的值,也可以是指令中的
         偏移再加上存储器指针寄存器的值,主要取决于指令的寻址方式。

在不改变段寄存器值的情况下,寻址范围最大是64KB。若某程序使用的总存储长度
(包括代码、堆栈、数据区)不超过64K,则整个程序可以合用一个段;若某程序的代码
长度、堆栈长度、数据区长度均不超过64KB,则可在程序开始处分别给DS、SS等段寄存
器赋值;若某程序的数据区长度超过64KB,则要在两个或多个数据段中存取数据,此时
需要改变数据段寄存器的段值。

转自:http://blog.csdn.net/yanxiansheng/article/details/7183042

时间: 2024-10-10 08:42:32

(转)存储器分段和地址计算的相关文章

程序存储器分段

程序存储器分为:text,data,bss,heap,stack text:代码段,存储汇编后程序机器语言指令,该段内执行是非线性的.text段禁用写权限. data:存储程序运行过程中要使用的全局变量,字符串和其他常量. bss:存储未初始化的内容. heap:heap段的大小是可变的.heap段中的所有存储单元又配器和回收器算法管理.分配器在堆中预留一部分区域,回收器取消预留的存储器,使该区域可以被下一次预留重新使用.堆从存储器的低地址向高地址增长. stack(先进后出):stack段的大

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

汇编语言基本概念汇总

汇编语言应该是我们现在学的最"低级"的语言了,因为现在不会再有人去学机器语言了.而汇编语言还在一些硬件或者嵌入式设备上使用并开发着.以下资料是为了大学的汇编考试整理的资料,现在与大家分享,希望能给大家提供帮助. 汇编语言程序设计汇总 计算机主要由运算器.控制器.存储器和输入输出设备五大部件构成. 字长word是指微处理器内部一次可以并行处理二进制代码的位数,它与微处理器内部寄存器以及CPU内部数据总线宽度是一致的,字长越长,所表示的数据精度就越高. 内存是由若干个存储单元组成,每个单元

CPU 实模式 保护模式 和虚拟8086模式

从80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式.只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode.实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存.在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务

8086中的七种寻址方式

寻址方式 8086/8088有七种基本的寻址方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址. 其中,后五种寻址方式(即直接寻址.寄存器间接寻址.寄存器相对寻址.基址变址寻址和相对基址变址寻址)属于存储器寻址,用于说明操作数或操作数地址所在存储单元的地址.这五种方式也就是确定存放操作数的存储单元有效地址EA的方法,这里所说的有效地址就是在前面一节讲存储器分段中所说的段内偏移地址. 除了这些基本的寻址方式以外,还有固定寻址和I/O端口寻址等,但不

8086汇编语言入门-HelloWorld

附件下载:  http://pan.baidu.com/s/1i5R9qO9    密码:rfgk 80x86微处理器汇编语言编程.学习任何编程语言都免不了要跨越HelloWorld这道坎,面向机器的汇编语言与面向过程/对象的高级语言不同,编码过程中对寄存器.内存的分配等细节都需要编程人员去关心:而高级语言程序如C语言.C++,即使你不知道printf具体是怎么实现的,只要掌握使用方法即可(封装成模块).C语言的helloworld程序简单到只有一行执行语句:   printf("Hello,W

实模式与保护模式

1. 实模式,又叫实地址模式,CPU完全按照8086的实际寻址方法访问从00000h--FFFFFh(1MB大小)的地址范围的内存,在这种模式下,CPU只能做单任务运行:寻址公式为:物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的. 2.保护模式,又叫内存保护模式,寻址采用32位段和偏移量,最大寻址空间4GB,在这种模式下,系统运行于多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,增加了对多任务的支持,增加了段页式寻址机制的内存管理(分

微型计算机原理复习(第六版)姚向华编著

微型计算机原理复习(第六版)姚向华编著(转载请注明出处) 第一章P37 05.   设机器字长为8位,最高位为符号位,试对下列各算式进行二进制补码运算: (2)8 + 18 = ?[8]补=[8]原 [18]补=[18]原 (4)-25 + 6 = ?[-25]补=[[-25]补]补 [6]补=[6]原 (6)9 - (-7)= ?[9]补=[9]原 [-7]补=[[-7]补]补 (8)-25 – 6 = ?[-25]补=[[-25]补]补 [6]补=[6]原 解: 2)0000 1000 +