汇编语言之寄存器(CPU工作原理)

1、介绍

一个典型的CPU,由运算器、控制器、寄存器等器件组成,对于游戏修改者来说,重点学习寄存器,其它不必管。
不同的CPU,寄存器的个数、结构是不相同的,8086CPU有14个寄存器,每个寄存器有一个名称,我们对它进行分类:

1.通用寄存器:AX、BX、CX、DX

2.段寄存器:CS、SS、DS、ES

3.指针寄存器:SP、BP

4.变址寄存器:SI、DI

5.指令指针寄存器:IP

6.标志寄存器:FR

2、通用寄存器

AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
以AX为例,寄存器的逻辑结构图如下:

字在寄存器中的存储字在寄存器中的存储

3 字在寄存器中的存储

4、物理地址

存储单元又叫内存单元,以后我们多数用内存单元这一名称。
所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地
址称为物理地址。
CPU通过地址总线送入内存的,必须是一个内存单元的物理地址,在CPU向地址总线上发出物理地址之前,必须要在内部先
形成这个物理地址,不同的CPU可以有不同的形成物理地址的方式,我们现在讨论8086CPU是如何在内部形成内存单元的物理
地址的。

5、 8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址,而8086CPU内部结构是16位的,一次性只能传送16位的地址,怎么

解决20位地址与16位地址不一致的问题呢?8086CPU采用一种在内部用2个16位地址合成的方法来形成一个20位的物理地

址。

当8086CPU要读写内存时,怎样在CPU内部形成物理地址的呢?

1:CPU中的相关部件提供2个16位的地址,一个称为段地址,另一个称为偏移地址。

2:段地址和偏移地址通过内部总线送入一个称为地址加法器的部件。

3:地址加法器将这两个16位地址合成为1个20位的物理地址。

地址加法器采用“段地址×16+偏移地址”的方法合成物理地址。即:段地址×16+偏移地址=物理地址。

“段地址×16”可以理解为段地址的16倍,以下这个说法更好理解。

我们把16转化为十六进制10,然后计算一下。假设段地址=2A7,2A7×10=2A70,计算结果2A70相对于段地址2A7左

移了一位,所以,段地址×16可以理解为:段地址左移一位。

问答题:如果段地址=A100,偏移地址=42B,那么,物理地址=?

答:段地址×16=段地址左移一位,即A100左移一位=A1000,A1000+42B=A142B,所以,物理地址是:A142B。

8086CPU要访问地址为123C8H的内存单元,此时,地址加法器的工作过程如下图所示(图中数据皆为十六进制表示):

6  CS和IP

8086CPU在访问内存时,要由相关部件提供内存单元的段地址和偏移地址,然后送入地址加法器合成物理地址,那么,是什

么部件提供段地址呢?是段寄存器提供段地址。8086CPU有4个段寄存器:CS、DS、SS、ES,本章先讲解CS。

CS和IP是8086CPU中2个最为关键的寄存器,它们指示了CPU当前要读取指令的地址,我们看一下CE,可以看出在游

戏中,什么是CPU要读取的指令地址,见下图:


 

 

上图指令执行后,AX中的数值为0123H。那么,接下来就是读取、执行下一条指令 BB 03 00(mov bx,0003h)了。

CS和IP的重要性在于它们的数值提供了CPU要执行指令的地址。

在1.5节中,我们说过,在内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候,把有的信息看作指令,

把有的信息看作数据,那么,CPU在什么时候把它看作指令?在什么时候把它看作数据呢?现在我们可以回答第一个问题了。

    答:只要内存单元(二进制信息)被CS:IP指向,那么,这些内存单元就会被CPU看作指令执行。

7  修改CS和IP的指令

Mov被称为传送指令,可以修改大部分寄存器的值。如:mov ax,123H,将ax中的值设为123H,同样地,我们可以mov
bx,2a4H  mov cx,5f0H  mov dx,b29H 等等。但是,mov不能修改CS和IP这两个寄存器的值,因为8086CPU没有提

供这样的功能。

要修改CS和IP的值,可以用jmp指令,事实上,还有一些指令是可以修改CS和IP的,这些指令被统称为转移指令,这

个在后面的课程会讲到,现在先学习这个最简单的转移指令:jmp。

若想同时修改CS和IP的值,可用形如“jmp 段地址:偏移地址”的指令完成。如:jmp 2ae3:9,执行后:CS=2ae3H,

IP=9H,CPU将从2ae39H处读取指令。

“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。

若想仅修改IP的值,可用形如“jmp 某一合法寄存器”的指令完成。如:jmp ax,执行前ax=437aH,CS=17f0H,IP=

423cH,执行后,CS不变,IP=437aH。

“jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP。为什么叫“某一合法寄存器”?因为不是所有寄存器都可

以修改IP。


8 代码段

在编程时,可以根据需要,将一组内存单元定义为一个段。段分3种类型:代码段、数据段、栈段。

对于8086PC机,我们可以将长度为N(N≤64KB)的一组代码(机器指令和汇编指令),存在一组地址连续、起始地址为

16的倍数的内存单元中,我们将这一组内存单元定义为代码段。

比如,将:  机器指令        汇编指令

            B8 00 00       mov ax,0000H

            05 23 01       add ax,0123H

            8B D8          mov bx,ax

            FF E3          jmp bx

这段长度为10字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就可以认为这是一个代码段。若要让CPU

执行这些指令,必须要将CS:IP指向代码段中第一条指令的首地址(123B0H)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过 C# 动态备份 Sql 数据库?

咨询区 kaiz.net我想写段代码来备份我的 Sql Server 2008 数据库&#xff0c;请问大家有什么好的方法吗&#xff1f;回答区 Stacked你可以用代码去执行 BACKUP DATABASE ... TO DISK 命令&#xff0c;比如下面这样&#xff0c;先配置下config。<?xml version"1.0&quo…

学好英语网首页制作_没有美术基础的新手小白,如何学好淘宝美工?

没有美术基础的新手小白&#xff0c;如何学好淘宝美工&#xff1f;俗话说&#xff1a;万事开头难&#xff0c;没有任何基础、没有美术基础学淘宝美工&#xff0c;要怎么学习好呢&#xff1f;显然&#xff0c;作为一名没有美术基础的新手小白&#xff0c;一般开始学习的时候都是…

14岁上中科大,18岁攻读麻省博士,28岁成为哈佛最年轻副教授,“华人女天才”的开挂人生...

全世界只有3.14 % 的人关注了爆炸吧知识哈佛年纪最小的副教授是中国人1997年美国颁发的罗伯特里得奖获得者蔡天西&#xff0c;22岁获国际生物统计学协会颁发的极大成就"半参数随机"奖&#xff0c;28岁成为哈佛最年轻的女性副教授&#xff0c;香港、美国、著名学术刊物…

lnmp_auto:自动化安装lnmp环境脚本

朋友找我在一台机器上帮忙安装下discuz。想着搭建过好几次的lnmp了&#xff0c;但是还没有使用过“一键安装”的自动化脚本&#xff0c;去网上有搜索出来&#xff0c;但是运行的时候发现用root运行别人的脚本还是真危险的事情&#xff0c;于是明白这不是个轮子&#xff0c;而是…

汇编语言之寄存器(内存访问)

1、内存中字的存储 2、ds和【address】 CPU要读写一个内存单元的时候&#xff0c;必须先给出这个内存单元的地址&#xff0c;在8086CPU中&#xff0c;内存地址由段地址和偏移地址组成&#xff0c; 其中&#xff0c;段地址存放在段寄存器DS中&#xff0c;DS称作数据段寄存器。…

JS实现图片预加载

网站开发时经常需要在某个页面需要实现对大量图片的浏览&#xff0c;如果考虑流量的话&#xff0c;大可以像pconline一样每个页面只显示一张图片&#xff0c;让用户每看一张图片就需要重新下载一下整个页面。不过&#xff0c;在web2.0时代&#xff0c;更多人愿意用javascript来…

用sort()方法随机打乱数组

2019独角兽企业重金招聘Python工程师标准>>> 我们先看一下随机数组排序的示例&#xff0c;再来研究其中的原理。 随机数组排序示例 var numbers [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; numbers numbers.sort(function(…

Linux下部署Kubernetes+Kubesphere(一)Kubernetes基础

1.服务器规划为配置Kubesphere高可用集群&#xff0c;需要三台或三台以上机器作为Master节点&#xff0c;每台机器既可以作为Master也可以作为Worker节点。其中Master节点数量建议为单数。该示例中采用三台服务器&#xff0c;即作为Master节点也作为Worker节点&#xff0c;配置…

触发器及其应用实验报告总结_调机技巧总结: 先快后慢射胶法及其应用

戳我进入社区&#xff1a;注塑和模具人的网上家园先快后慢&#xff0c;也即先用一级快速射胶&#xff0c;射到某个设定的位置时&#xff0c;再起二级慢速射胶。这个二级起级点一般是设在射胶充型的后期&#xff0c;也即接近充型结束的位置。使用一级快速射胶&#xff0c;可以保…

汇编语言之寻址方式

&#xfeff;&#xfeff;1、内存单元和[bx]的描述 要完整地描述一个内存单元&#xff0c;需要两种信息&#xff1a;1.内存单元的地址&#xff1b;2.内存单元的长度&#xff08;即是字节单元还是字单元&#xff09;。 如&#xff1a;mov ax, [2a78] 表示将一个内存单元中的数…

命名空间的使用

namespace hunan\changsha class Person{ static $namewu_han; } namespace hunan\changsha 声明命名空间&#xff0c;它的作用包括方法&#xff0c;类名&#xff0c;常量&#xff0c;这三者都统称为元素 当在程序里使用元素的时候&#xff0c;默认在当前的命名空间里找该元素…

使用 dotnet-monitor 在 Kubernetes 中收集 .NET metrics

使用 dotnet-monitor 在 Kubernetes 中收集 .NET metricsIntrodotnet-monitor 是微软推出的一个帮助我们诊断和监控 .NET 应用程序的工具&#xff0c;在 Kubernetes 中我们可以让 dotnet-monitor 作为 sidecar 运行&#xff0c;无侵入地监控 .NET 应用&#xff0c;今天我们就来…

DOM 事件深入浅出(二)

在DOM事件深入浅出&#xff08;一&#xff09;中&#xff0c;我主要给大家讲解了不同DOM级别下的事件处理程序&#xff0c;同时介绍了事件冒泡和捕获的触发原理和方法。本文将继续介绍DOM事件中的知识点&#xff0c;主要侧重于DOM事件中Event对象的属性和方法。 那么什么是DOM事…

arcgis 分区 属性值_ArcGIS制图之Maplex自动点抽稀

制图工作中&#xff0c;大量密集点显示是最常遇到的问题。其特点是分布可能不均匀、数据点比较密集&#xff0c;容易造成空间上的重叠&#xff0c;影响制图美观。那么&#xff0c;如果美观而详细的显示制图呢&#xff1f;主要原理Maplex中对标注有很好的显示控制&#xff0c;一…

学术造假导致导师自杀,后将这段学术丑闻经历出书贩卖,一年收入上百万......

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术2020年2月11日&#xff0c;小保方晴子又被撤回了一篇研究论文。Tissue Engineering Part A撤稿给出的原因是&#xff1a;通过哈佛医学院正式调查后&#xff0c;无法确实其实验结果的准确性&#xff0c;尽管作者本人坚持已…

汇编语言之数据处理的2个基本问题

&#xfeff;&#xfeff;1、bx、si、di和bp Bx、si和di这3个寄存器我们已经学过了&#xff0c;现在进行一下总结&#xff0c;并学一下bp。 1&#xff1a;在8086CPU中&#xff0c;只有这4个寄存器可以用在[…]中来进行内存单元的寻址。比如&#xff0c;下面的指令都是正确 的…

js(jQuery)获取时间的方法及常用时间类

获取JavaScript 的时间使用内置的Date函数完成 var mydate new Date();mydate.getYear(); //获取当前年份(2位)mydate.getFullYear(); //获取完整的年份(4位,1970-????)mydate.getMonth(); //获取当前月份(0-11,0代表1月)mydate.getDate(); //获取当前日(1-31)mydate.getD…

phalcon: 缓存片段,文件缓存,memcache缓存

几种缓存&#xff0c;需要用到前端配置&#xff0c;加后端实例配合着用 片段缓存&#xff1a; public function indexAction(){//渲染页面$this->view->setTemplateAfter(common);//缓存片段 //前端配置$frontcache new \Phalcon\Cache\Frontend\Output(array(&q…

nvm用标准sata ahci码_能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘...

不知不觉当中&#xff0c;固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘&#xff0c;使用NVMeSATA的固态硬盘高低搭配。既然是高低搭配&#xff0c;就一定会有性能差距&#xff0c;是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速&#xff0…