【新书推荐】6.2节 段寄存器

在16位汇编语言的源程序中,我们将源程序按照不同的功能和作用划分为若干个逻辑段,如数据段用来存储数据,代码段用来存储代码,堆栈段用来保存临时数据,附加段用来拷贝数据。我们可以把汇编语言的源程序抽象地理解为数据在内存与寄存器之间的移动。如若准确地读写内存单元存储的数据,指定内存单元的地址是关键。16位汇编语言源程序中的地址为逻辑地址,由段值和偏移两部分组成,如CS:IP表示指向CS代码段的IP偏移地址处。具体的寻址方式我们将在第七章详细讲述,此处不再赘述。

本节内容:CPU内部的段寄存器就是用来存储段值的。本节我们将详细讲述8086 CPU内的段寄存器的功能和使用方法。

存储单元的地址和内容:内存是以字节为单位的线性地址空间。一个字节对应一个地址编号。一个存储单元即一个字节,包含8个数据位。8086 是16位计算机,一次可以读写8位或16位二进制数。

存储器的分段:8086 计算机1M大小的寻址空间可以人为的划分为若干个逻辑段,最小段为16个字节,最大段为64KB。一个汇编源程序中至少包含一个代码段,通常包含代码段、数据段和堆栈段。此外,附加段用于数据拷贝。

逻辑地址转换为物理地址:汇编源程序中使用“段值:偏移”这种形式的逻辑地址,段值和偏移采用16位数表示。段值使用段地址标号表示,编译器编译链接后生成以“.exe”为后缀名的二进制可执行程序,加载到DOS操作系统时,将段地址标号替换为具体的段值,以实现不同计算机系统间的代码重载。偏移表示段内的相对位移量。8086 CPU读取指令时,通过CPU内部的地址加法器按照段值左移四位加偏移的算法,将逻辑地址转换为20位物理地址后访问物理内存。

段寄存器:8086 CPU内包含四个段寄存器。CS存储代码段的段值,DS存储数据段的段值,SS存储堆栈段的段值,ES存储附加段的段值。堆栈内存储数据的规则为Last in First Out,后进先出规则。

6.2.1 存储单元的地址和内容

存储单元的地址

在8086 计算机中,内存是以字节为单位的线性地址空间。内存存储单元的地址以二进制数表示,从0开始编号,每次加1。存储单元地址为无符号整数,n位二进制数总共可以表示2n个存储单元地址。为了书写方便,存储单元地址以十六进制数表示。

x86CPU是以小端方式存储的,即高高低低的存储原则。我们在前面“2.5节有符号整数无符号整数”中详细讲述过,此处不再赘述。

存储单元的内容

举例

         根据表6-8所示内容,指出下列地址处对应

存储单元内的内容:

  1. 地址56780H存储单元内容:

字节34H,字1234H,双字FF561234H

  1. 地址834ABH存储单元内容:

字节80H,字6754H,双字不能确定

表6-8 存储单元的内容

6.2.2 存储器的分段

8086计算机寻址空间

在8086 CPU中,有16根控制线、16根数据线和20根地址线。如果地址线同样也是16根,那么可直接寻址的内存空间为216=64KB。假如使用64KB的寻址范围,除去中断向量表、DOS系统、显存、和各种硬件设备的ROM内存空间,可供加载应用程序的内存空间将极其有限。在当时的条件下,将地址线增加到了20根,可直接寻址的空间扩大到了220,即1MB,寻址范围是00000H-FFFFFH。相应的措施是,在CPU内部增加一个地址加法器,将一个16位的段值左移4位,加上一个16位的偏移,得到20位的物理地址。

逻辑段

8086计算机通过对存储器分段和使用段寄存器的方法有效的实现了寻址1MB物理空间。

根据需要将1MB物理地址空间分为若干个逻辑段。每个逻辑段必须满足三个条件:

●逻辑段的开始地址为16的倍数;

●逻辑段的最大长度为64K;

●16位的段内偏移在0~FFFFH之间。

最小逻辑段为16个字节,最大逻辑段为64KB。

1MB地址空间最多划分64K(1MB/16B)个逻辑

段,最少划分为16(1MB/64KB)个逻辑段。

如图6-7所示,逻辑段与逻辑段可以相连,也可

以不相连,还可以重叠。

                 图6-7 逻辑段的划分

逻辑地址

逻辑地址(源程序中编写的地址)表示方法: 

段值:偏移 

举例

1.例如:CS:IP,CS代码段寄存器存储16位逻辑代码段的段值,IP指令指针寄存器存储16位代码段指令偏移地址。

2.例如:DS:[SI],DS数据段寄存器存储16位逻辑数据段的段值,SI变址寄存器存储16位数据段偏移地址。

         ■划分逻辑段的优点

●有利于实现寻址1MB空间;

●有利于管理存储空间;

●实现程序的重定位和浮动;

●实现代码数据的隔离;

●充分利用存储空间。

         其实上述优点有些言过其辞。这只是针对当时8086 CPU的时代而言。受限于当时8086计算机只有20根地址线,内存寻址空间只有1M大小。如何充分有效的利用现有条件,是首要考虑的问题。对于今天的64位计算机,264个字节的内存寻址空间,远大于我们的实际物理内存大小,不需要再使用段寄存器作为间接寻址的方式。8086计算机采用段值:偏移的寻址方式,显得有些复杂。

         对于上述优点的解释,这里不再赘述。再细致的描述也不如读者自己在后续的代码练习中亲身体会。

6.2.3 逻辑地址转换为物理地址

         我们在汇编源代码中编写的“段值:偏移”这种组合形式的逻辑地址,仅是人为定义的。计算机要真正执行这些由数据和指令构成的程序,还需要加载到真正的物理内存,并且对物理内存进行读写操作。这就需要我们将代码中的逻辑地址转换为物理地址。

转换方法

将16位段地址和16位偏移地址合成一个20位地址。

物理地址=段地址×16+偏移地址

段的本质:基础地址(起始地址×16)+偏移地址

            图6-8 间接寻址方式

         如图6-8所示,由A点到C点的寻址方式有两种。一种方法是直接寻址,由A点直接到C点;另一种方法是间接寻址,由A点先到B点,然后再由B点到C点。8086计算机采用的是间接寻址方式。

8086 CPU内部的地址加法器

8086的逻辑地址是由16位的段值和16位的偏移组成,当我们把逻辑地址输入CPU内部后,需要将逻辑地址转换为20位的物理地址,然后才可以真正执行内存的读写操作。这是由CPU内部的地址加法器实现的,如图6-9所示。

                                                   图6-9 8086CPU内的地址加法器

地址加法器的工作过程

                                                                 图6-10 地址加法器工作过程

如图6-10所示,地址加法器按照段值左移4位+偏移的算法,将逻辑地址转换为20位的物理地址,就可以正确的在物理内存内寻址。注:段值左移4位即段值×16。

注意

         8086计算机一个物理地址可以对应多个逻辑地址。

例如:逻辑地址076A:10指向的物理地址为076B0H;

           逻辑地址076B:0指向的物理地址同样是076B0H;

提示

         逻辑的意思可以理解为是人为定义的。因而逻辑段就是人为定义的段。逻辑地址就是人为定义的地址。

6.2.4 段寄存器

CS代码段

编程时根据需要,将一组内存单元定义为一个段。我们可以将长度为N(N<=64KB)的一组代码,存放在一组地址连续、起始地址为16的倍数的内存单元中,这段用来存放代码的内存就称为代码段。

DS数据段

一段用来存放数据的内存称为数据段。

SS堆栈段

8086 CPU提供相关指令以栈的方式访问的内存空间,称为堆栈。堆栈内存储数据的规则为Last in First Out——后进先出规则。如图6-11所示,最后存入的《Windows》放置在最上层,取得时候也是先取最上层的《Windows》。堆栈段为动态内存分配空间,根据需要,随时可以增加或释放堆栈空间。

运行在8086计算机上的DOS操作系统默认分配的堆栈段为64KB。系统自动分配为栈,程序员也可以自己根据实际需要分配一段内存空间作为堆栈段。Windows系统默认分配的堆栈通常为1M大小,LINUX系统默认分配的堆栈通常为8M大小。

ES附加段

为了方便复杂数据寻址和操作,增加定义一个附加的数据段空间。80386 CPU多了2个附加段FS和GS。附加段通常用来做数据拷贝。

图6-11 堆栈存储数据规则演示

练习

1、假设段地址为0001H,不改变段值,仅变化偏移地址,CPU的寻址范围为 _______ 到_______H 。

2、有一个数据存放在内存20000H单元中,假设给定段地址为DATA,如果用偏移地址寻址此单元。则DATA应满足的条件是:最小为 _______H ,最大为________H 。

提示:反过来思考,当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。

3、8086计算机上运行的程序在某一时刻最多可以访问几个段?程序至少可以有几个段?

4、8086如何寻址1M字节的物理地址空间?在划分段时,必须满足的两个条件是什么?最多可以把1M字节空间划分成几个段?最少可把1M字节地址空间划分为几个段?

5、8086存储单元的逻辑地址是怎样表示的?存储单元的20位物理地址如何构成?

6、当段重叠时,一个存储单元的地址可以表示成多个逻辑地址。请问物理地址12345H可表示多少个不同的逻辑地址?偏移最大的逻辑地址是什么?偏移最小的逻辑地址是什么?

7、8086CPU是如何处理超出1MB寻址范围这种情况的?

本文摘自编程达人系列教材《X86汇编语言基础教程》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372414.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP与UDP:传输层协议的差异与选择

在计算机网络中&#xff0c;传输控制协议&#xff08;TCP&#xff09;和用户数据报协议&#xff08;UDP&#xff09;是两种常用的传输层协议。然而&#xff0c;随着互联网的快速发展&#xff0c;传统的TCP和UDP在某些场景下存在一些限制。为了解决这些问题&#xff0c;出现了新…

如何使用VS Code编写小游戏并实现公网游玩本地游戏【内网穿透】

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通过cpolar内网穿透发布到公网&#xff0c;分…

No matching client found for package name ‘com.unity3d.player‘

2024年2月5日更新 必须使用Unity方式接入Unity项目&#xff01;一句话解决所有问题。&#xff08;真的别玩Android方式&#xff09; 大致这问题出现原因是我在Unity采用了Android方式接入Firebase&#xff0c;而Android接入实际上和Unity接入方式有配置上的不一样&#xff0c;我…

爬虫工作量由小到大的思维转变---<第四十五章 Scrapyd 关于gerapy遇到问题>

前言: 本章主要是解决一些gerapy遇到的问题,会持续更新这篇! 正文: 问题1: 1400 - build.py - gerapy.server.core.build - 78 - build - error occurred (1, [E:\\项目文件名\\venv\\Scripts\\python.exe, setup.py, clean, -a, bdist_uberegg, -d, C:\\Users\\Administrat…

链表经典算法(+OJ刷题)

文章目录 前言一、移除链表元素二、链表的中间节点三.反转链表四.合并两个有序链表五.分割链表六.环形链表的约瑟夫问题总结 创作不易&#xff0c;点赞收藏一下呗&#xff01;&#xff01;&#xff01; 前言 在上一节&#xff0c;我们介绍了单链表的增&#xff0c;删&#xff…

机器学习基础、数学统计学概念、模型基础技术名词及相关代码个人举例

1.机器学习基础 &#xff08;1&#xff09;机器学习概述 机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;通过使用统计学和计算机科学的技术&#xff0c;使计算机能够从数据中学习并自动改进性能&#xff0c;而无需进行明确的编程。它涉及构建和训练机器…

用Python实现MD5加密

用Python实现MD5加密 用Python实现MD5加密时用到的是hashlib模块&#xff0c;可以通过hashlib标准库使用 多种Hash算法&#xff0c;如SHA1 、SHA224 、SHA256 、SHA384 、SHA512和MD5算法 等。下面是通过调用hashlib模块对字符串进行MD5加密的简单实例&#xff1a; from hash…

[UI5 常用控件] 06.Splitter,ResponsiveSplitter

文章目录 前言1. Splitter1.1 属性 2. ResponsiveSplitter 前言 本章节记录常用控件Splitter,ResponsiveSplitter。主要功能是分割画面布局。 其路径分别是&#xff1a; sap.ui.layout.Splittersap.ui.layout.ResponsiveSplitter 1. Splitter 1.1 属性 orientation &#x…

DBeaver连接达梦数据库

1、下载驱动文件 可官网下载Hibernate 框架 | 达梦技术文档 (dameng.com) 1. 打开DBeaver软件&#xff0c;点击“数据库”&#xff0c;选择“驱动管理器” 2. 点击“新建”进行达人大金仓驱动管理器配置。 3、创建驱动-设置&#xff1a;驱动名称、类名、url 驱动名称&#…

(2017|ICLR,EBGAN,AE 鉴别器,正则化)基于能量的 GAN

Energy-based Generative Adversarial Network 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. EBGAN 模型 2.1 目标函数 2.2 解决方案的最优解 2.3 使用自动编码器 2.…

Android Button background 失效

问题 Android Button background 失效 详细问题 笔者开发Android项目&#xff0c;期望按照 android:background中所要求的颜色展示。 实际显示按照Android 默认颜色展示 解决方案 将xml的Button 组件修改为<android.widget.Button> 即将代码 <Buttonandroid:l…

RCS-YOLO复现

复现结果–Precision&#xff1a;0.941&#xff0c;Recall&#xff1a;0.945&#xff0c;AP 50 _{50} 50​&#xff1a;0.941&#xff0c;AP 50 : 95 _{50:95} 50:95​&#xff1a;0.693&#xff0c;误差在5个点内&#xff0c;可以接受 感想 第5篇完全复现的论文

Facebook与全球文化:多元化视角下的社交体验

在数字时代的今天&#xff0c;Facebook如一座横跨全球的桥梁&#xff0c;将人们从世界各地连接在一起。这个社交媒体平台已经不仅仅是一个在线社交的工具&#xff0c;更是一个全球化时代的文化交汇点。本文将深入研究Facebook在全球文化中的作用&#xff0c;以及它如何在多元文…

[python] 过年燃放烟花

目录 新年祝福语 一、作品展示 二、作品所用资源 三、代码与资源说明 四、代码库 五、完整代码 六、总结 新年祝福语 岁月总是悄然流转&#xff0c;让人感叹时间的飞逝&#xff0c;转眼间又快到了中国传统的新年&#xff08;龙年&#xff09;。 回首过去&#xf…

AUTOSAR内存篇 -EEPROM Abstraction(EA)

文章目录 功能介绍一般行为寻址机制和分段地址计算擦/写次数限制“立即” 数据的处理管理块一致性信息总结本文介绍关于EEPROM Abstraction相关的内容。下图所示为内存硬件抽象层的模块架构图。 EEPROM抽象(EA)从器件特定的寻址方案和分段中抽象出来,并为上层提供虚拟寻址方…

C++进阶--搜索二叉树

概念 搜索二叉树是一种特殊的二叉树&#xff0c;其具有以下特点&#xff1a; 1.对于每个结点&#xff0c;它的左子树中的所有节点的值都小于该节点的值&#xff0c;而右子树中的所有节点的值都大于该节点的值。 2.左子树和右子树都是搜索二叉树。 这个 特性使得搜索二叉树可…

PyTorch的10个基本张量操作

PyTorch是一个基于python的科学计算包。它的灵活性允许轻松集成新的数据类型和算法&#xff0c;并且框架也是高效和可扩展的&#xff0c;下面我们将介绍一些Pytorch的基本张量操作。 Tensors 张量Tensors是一个向量&#xff0c;矩阵或任何n维数组。这是深度学习的基本数据结构…

C语言贪吃蛇详解

个人简介&#xff1a;双非大二学生 个人博客&#xff1a;Monodye 今日鸡汤&#xff1a;人生就像一盒巧克力&#xff0c;你永远不知道下一块是什么味的 C语言基础刷题&#xff1a;牛客网在线编程_语法篇_基础语法 (nowcoder.com) 一.贪吃蛇游戏背景 贪吃蛇是久负盛名的游戏&…

图解报文网关:一种低代码报文网关的创新设计

所有的支付系统都对接了很多的外部支付、流出、外汇等各种类型的渠道&#xff0c;这些渠道的接口和报文格式各异。今天和大家一起聊聊如何实现一种简洁高效的低代码报文网关设计&#xff0c;主要包括&#xff1a;报文网关的定位&#xff0c;三种形态&#xff0c;低代码报文网关…

ClickHouse时区

clickhouse数据库的时间是UTC时间。服务器默认的是上海时间。 sudo vim /etc/clickhouse-server/config.xml clickhouse默认的时区是注释的就是UTC时间 %F 表示日期&#xff0c;格式为 YYYY-MM-DD。%T 表示时间&#xff0c;格式为 HH:MM:SS。 因此&#xff0c;formatDateT…