段寄存器与逻辑地址的相关内容

寄存器操作数:(存放在CPU中)

MOV AX,0FFFFH

AX 即为寄存器操作数。

操作数本身存放于寄存器中,在指令中只是给出了几个位的代码来表示它具体存放在那个寄存器中。

内存中的数据经过寄存器读入CPU,进入数据的运算。

内存操作数:(存放在内存中)

其存储于某内存区域,因此叫内存操作数。

  1. mydata dw 1234H 或 mydata db 12H等

    上述中mydata这样的变量

  2. xx db 0FFH,0

    mov bx, OFFSET xx //用offset运算符计算出xx单元的偏移值

    mov ax,[bx]

    上述中[bx]就叫做非变量名直接寻址的内存操作数

段寄存器:

段寄存器是因为对内存的分段管理而设置的。

为什么需要内存分段?

8086CPU有20根地址线,最大可寻址内存空间为1MB。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为24,即16个段,每段不超过64KB(216,16位数据线就可以寻址)。

因此在8086中设置4个16位的段寄存器,用于管理4种段:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。 把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,称高16位为段基值 ,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址

但在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但段寄存器只有16位。

因此段寄存器中只能存储段号,也叫做段选择符,再由段号映射到存在内存中的GDT(全局段号记录表),读取段的信息。

虚拟空间(虚拟存储器地址空间)/编程空间 (程序的编写空间)

存储管理部件把主存(物理存储器)和辅存(磁盘)看作是一个整体,即虚拟存储器。486允许虚拟存储器容量最大为246=64T,即程序员可在此地址范围内编程,程序可大大超过物理空间。

因此CPU必须将一个虚拟内存空间中的地址转换为物理地址(程序的运行空间)

需要进行两步:

1.首先将给定一个逻辑地址,CPU先利用其段式内存管理单元,先将为个逻辑地址转换成一个线性地址

2.再利用其页式内存管理单元,转换为最终物理地址。

注:

  1. 如果不分页的话,线性地址就是物理地址;
  2. 如果分页的话,则由分页部件把线性地址转换为

    物理地址。

  3. 实模式:存储空间仅分段,而不分页;

    保护模式:存储空间先分段,再分页。

什么是逻辑地址?

逻辑地址是CPU所生成的地址 ,指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址。

一个逻辑地址由两部份组成,段标识符: 段内偏移量(offset)。段标识符是由一个16位长的字段组成,称为段选择符。段选择符存放在段寄存器中。其中前13位是一个索引号。后面3位包含一些硬件细节。

索引号,或者直接理解成数组下标,它又是什么东东的索引呢?这个东东就是“段描述符(segment descriptor)”,(有数据段描述符,代码段描述符,系统段描述符)。段描述符具体地址描述了一个段。

这样,很多个段描述符,就组了一个数组,叫“段描述符表”,这样,可以通过段标识符的前13位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个段,每一个段描述符由8个字节组成。段描述符中有Base字段,它描述了一个段的开始位置的线性地址。把Base + offset,就是要转换的线性地址了。

注:

一些全局的段描述符,就放在“全局段描述符表(GDT)”中。

一些局部的,例如每个进程自己的,就放在的“局部段描述符表(LDT)”中。

段选择符中的T1字段,=0,表示用GDT,=1表示用LDT。

如指令:

1.直接寻址
格式:段寄存器:[偏移地址]
mov bx, ds:[1234H] //表示从ds数据段偏移地址为1234H的单元取数——>bx
假设(DS)=5000H 可计算出
线性地址为16d×(DS)+1234H=16d×5000H+1234h=50000H+1234H=51234H 。
命令的最后结果就是把线性地址为51234H的存储单元中的操作数据放入BX中

2.间接寻址
格式:段寄存器:[间址寄存器] / [间址寄存器]
注意:可省略段寄存器是因为会到默认约定的段寄存器中取内容数据
例:
mov ds,数据段段基址
mov bx,buf单元的偏移地址
mov al,ds:[bx]
等价于:mov al,[bx]

间接寄存器和约定访问的逻辑段如下图所示:

分页内存管理

核心:将虚拟内存空间和物理内存空间借划分为大小相同的页,并以页作为内存空间划分的最小单位。空间增长也容易实现:只需要分配额外的虚拟页面,并找到一个闲置的物理页面存放即

为什么需要分页内存管理?

因为有以下优点:

  1. 不会产生外部碎片化(空间碎片化的根源就是每个程序的大小不一样,这样在空间分配时不存在一致性。解决的办法自然是将空间按照某种规定的大小进行分配。将虚拟内存和物理内存都分成大小一样的部分,我们称之为“页”。),一个进程占用的内存空间可以不是连续的,
  2. 一个进程的虚拟页面在不需要时,可以存放在磁盘上,不需要全部同时加载到内存上。
  3. 可以共享小的地址,即页面共享。只要给相应的页表里面做一个相应的记录便可。

在分页系统的机制下:

一个程序发出的虚拟地址由两部分组成:页面号 和 页内偏移值

这个total_page数组有2^20个成员,每个成员是一个地址(32位机,一个地址也就是4字节),那么要单单要表示这么一个数组,就要占去4MB的内存空间。为了节省空间,引入了一个二级管理模式的机器来组织分页单元。

所以每一个32位的线性地址被划分为三部份,页目录索引(10位):页表索引(10位):偏移(12位)

依据以下步骤进行转换:

  1. cr3寄存器中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
  2. 根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
  3. 根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
  4. 将页的起始地址与线性地址中最后12位相加,得到最终我们想要的物理地址;

原文地址:https://www.cnblogs.com/Hhhighway/p/12684920.html

时间: 2024-10-12 19:53:19

段寄存器与逻辑地址的相关内容的相关文章

第二章 寄存器相关内容总结

对于一个汇编程序员来说,CPU中的主要部件是寄存器.寄存器是CPU中程序员可以用指令读写的部件.程序员通过改变各种寄存器中的内容来实现对CPU的控制.不同的CPU,寄存器的个数.结构是不相同的.8086CPU有14个寄存器,每个寄存器有一个名称. 8086CPU的所有寄存器都是16位的,可以存放两个字节.AX.BX.CX.DX.这4个寄存器通常用来存放一般性的数据,被称为通用寄存器.出于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据.字节:记为byte,一个字节由8个bit组成,

第三章 寄存器(内存访问)相关内容总结

在本章中,我们从访问内存的角度继续学习了几个寄存器.我们提出字单元的概念:字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成.高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节.CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成.8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址.我们用mov指令在寄存器和内存之间进行字节型数据的传送.因为8086CPU是16位结构,有

移动端 h5开发相关内容总结——CSS篇

移动端 h5开发相关内容总结——CSS篇 标签: css移动 2016-01-06 15:59 5536人阅读 评论(3) 收藏 举报  分类: HTML+CSS(17)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=n

栈Stack和段寄存器SS,SP(学习汇编)

1. 栈有2个基本操作:入栈.出栈 2. 栈顶的元素总是最后入栈,最先出栈:后进先出. 3. 8086CPU提供入栈和出栈的指令,最基本的两个是 PUSH(入栈) 和 POP(出栈) push ax 表示将AX寄存器的内容送入栈中, pop ax 表示从栈顶取出数据送入AX寄存器中.     8086CPU的入栈和出栈操作都是以字(word)为单位的. 4. 8086CPU中,段寄存器SS:存放栈顶段地址,段寄存器SP: 存放栈顶的偏移地址. 5. 任意时刻:SS:SP 指向栈顶元素. 6. 8

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个

段寄存器和8种地址寻址方式

段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定:1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令.2. 取堆栈:段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元.另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶.3. 取数据:段

汇编——段寄存器

段寄存器 8086CPU有14个寄存器 AX,BX,CX,DX,si,di,sp,bp,ip,cs,ss,ds,es,psw 其中有8个通用寄存器 8086寄存器16位,可以存放两个字节 AX BX CX DX一般用来存放一般数据 为保证兼容性,这四个寄存器可以分为两个独立的8位寄存器使用 AX可以分为AH和AL H高L低 同样的对于ABCD-X 字在寄存器中的存储 一个字可以存在一个16位寄存器中 Word=2B 关于数制的讨论 二进制太冗长 几条汇编指令 Mov ax,18         

段寄存器(8086CPU)和代码段

1.段寄存器 8086CPU有4个段寄存器:CS.DS.SS.ES.当8086CPU访问内存时,由这4个段寄存器提供内存单元的段地址. CS和IP是8086中最关键的寄存器,他们指示了CPU当前要读取指令的地址.CS是代码段寄存器,IP为指令指针寄存器.在8086PC机中,任意时刻,设CS中的内容是M,IP中的内容是N,8086CPU将从内存地址:M*16+N处读取指令并执行.也可以这样表述,8086机中,任意时候,CPU将CS:IP指向的内容当做指令执行,.CPU将CS.IP中的内容当做指令的

汇编语言——寄存器(内存访问 ds数据段寄存器,ss栈段寄存器)

在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? #  20H(2)0地址字单元中存放的字型数据是多少? # 4e20H(3)2地址字单元中存放的字节型数据是多少? # 12H(4)2地址单元中存放的字型数据是多少?    #  0012H(5)1地址字单元中存放的字型数据是多少? #