汇编语言-第二章 寄存器(CPU工作原理)

概述

一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连接。 内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。

简单来说,在CPU中:

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各种器件进行工作
  • 内部总线连接各种器件,在它们之间进行数据的传送

寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。 不同的CPU,寄存器的个数、结构是不同的。

2.1 通用寄存器

通用寄存器通常用来存放一般性的数据。

2.2 字在寄存器中的存储

出于对兼容性的考虑,8086CPU可以一次性处理两种尺寸的数据:

  • 字节:记为byte,一个字节由8个比特(即二进制位)组成,可以存在8位寄存器中。
  • 字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。

2.3 几条汇编指令

2.4 物理地址

CPU通过地址总线送入存储器的必须是一个内存单元的物理地址。 在CPU向地址总线上发出物理地址之前,必须在内部先形成这个物理地址。 不同的CPU可以有不同的形成物理地址的方式。

2.5 16位结构的CPU

16位结构的CPU具有下面几方面的结构特性:

  • 运算器一次最多可以处理16位的数据
  • 寄存器最大宽度为16位
  • 寄存器和运算器之间的通路为16位

内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。

2.6 8086CPU给出物理地址的方法

8086CPU有20位地址线,可以传送20位地址,达到1MB的寻址能力。 8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。 从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB。 事实上,8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

8086CPU相关部件的逻辑结构如图所示:

当8086CPU要读写内存时: (1).CPU中的相关部件提供两个16位地址,一个称为段地址,一个称为偏移地址 (2).段地址和偏移地址通过内部总线送入一个称为地址加法器的部件 (3).地址加法器将两个16位地址合并成哟个20位物理地址 (4).地址加法器通过内部总线将20位物理地址送入输入输出控制电路 (5).输入输出控制电路将20位物理地址送上地址总线 (6).20位物理地址被地址总线传送到存储器 地址加法器采用物理地址=段地址X16+偏移地址的方法用段地址和偏移地址合成物理地址。

2.7 “段地址×16+偏移地址=物理地址”的本质含义

本质含义就是: CPU在访问内存时,用一个基础地址(段地址×16)和一个相对基础地址的偏移地址相加,给出内存单元的物理地址。

更一般的说,8086CPU这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址×16可以看作是基础地址。

2.8段的概念

"段地址"中的“”的概念,其实来自于CPU。内存并没有分段,段的划分来自于CPU。

2.9段段寄存器

段地址在8086CPU的段寄存器中存放。 8086有4个段寄存器:CS,DS,SS,ES。

2.10 CS和IP

当8086CPUCPU要访问内存时由这4个段寄存器提供内存单元的段地址。

CS和IP是8086CPU中两个最关键的寄存器,他们指示了CPU当前要读取指令的地址。

  • CS为代码段寄存器
  • IP为指令指针寄存器

在8086PC中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M×16+N单元开始,读取一条指令并执行。 也可以描述为:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

如图显示了8086CPU读取、执行指令的工作原理:

  • 8086CPU当前状态:CS中的内容为2000H,IP中的内容为1000H
  • 内存20000H~20009H单元中存放着可执行的机器码

2.11 修改CS、IP的指令

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器的内容实现对CPU的控制。 CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。 8086CPU大部分寄存器的值,都可以通过mov指令来改变。mov指令被称为传送指令。 mov指令不能用于设置CS、IP的值,原因是:8086没有提供这样的功能。 能够改变CS、IP的内容的指令被统称为转移指令

指令:jmp 某一合法寄存器 功能:用寄存器中的值修改IP的值

例如:

jmp ax
执行命令前:ax=1000H,CS=2000H,IP=0003H
执行命令后:ax=1000H,CS=2000H,IP=1000H
jmp bx
执行命令前:bx=0B16H,CS=2000H,IP=0003H
执行命令后:bx=0B16H,CS=2000H,IP=0B16H

jmp ax,其实就是用ax将IP的值覆盖

2.12 代码段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一段。可以将长度为N(N<=64KB5)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中。存在这段内存单元中的代码可以成为一个代码段。

例如:

mov ax,0000          (B8 00 00)
add  ax,0123          (05 23 01)
mov bx,ax              (8B D8)
jmp bx                    (FF E3)
这段长度为10字节的指令,存在从123B0H~123BAH的一组内存单元中,    
我们就可以认为123B0H~123BAH这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10字节

将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动的将我们定义的代码段中的指令当作指令来执行。 CPU只认被CS:IP指向的内存单元中的内容为指令。 要让CPU执行我们放在代码段中的指令,必须要将CS:iP指向所定义的代码段中的第一条指令的首地址。

2.9节~2.12节 小结

  • 段地址在8086CPU的段寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
  • CS存放指令的段地址,IP存放指令的偏移地址。
  • 8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
  • 8086CPU的工作过程: (1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器 (2)IP指向下一条指令 (3)执行指令 (4)转到步骤(1),重复这个过程
  • 8086CPU提供转移指令修改CS、IP的内容。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

索引

最简单的索引策略就是:将key值的offset存入在内存,使用hash表进行管理,在搜索时,会先根据key值找到offset,进而由offset找到对应的v...

1345
来自专栏偏前端工程师的驿站

网页优化系列一:合并文件请求(asp.net版)

  最近因公司需要对网站的优化处理学习了一番,现在借本系列博文与大家分享一下自己的学习成果,有纰漏处请大家多多指正。   首先推荐一篇十分全面的网页优化文章  ...

2178
来自专栏云计算教程系列

开源资产管理系统Snipe-IT安装教程

在IT行业中,需要完整的生命周期跟踪资产的资产管理,包括采购,维护,存储和处置。Snipe-IT是专为IT资产管理而设计的免费开源应用程序,提供基于Web的界面...

1.5K4
来自专栏漫漫全栈路

Nginx配置文件nginx.conf详解

最近折腾Ubuntu比较多,也基本原理了Windows和IIS了,论一个软狗的堕落史。既然换到Ubuntu系统上来,勉强算个web开发人员的我当然用的最多的就...

6667
来自专栏Coding迪斯尼

java开发操作系统:一个程序向另一个程序伸出的咸猪手

1664
来自专栏Java开发

Linux中bond网卡绑定方法

HWADDR对应mac地址 # ifconfig -a 可以查看 UUID对应网卡UUID Linux 查看网卡UUID

1791
来自专栏blackheart的专栏

[OIDC in Action] 1. 基于OIDC(OpenID Connect)的SSO

在[认证授权]系列博客中,分别对OAuth2和OIDC在理论概念方面进行了解释说明,其间虽然我有写过一个完整的示例(https://github.com/lin...

38010
来自专栏后端技术探索

7个角度进行nginx性能优化

在大多数情况下,一个常规安装的Nginx对网站来说已经能很好地工作了。然而如果想挤压出Nginx的性能,就需要了解哪些指令会影响Nginx性能,在本文中将解释N...

1462
来自专栏遊俠扎彪

如何解决MySQL中文乱码及插入中文信息错误的问题

从前和最近,帮人做点东西的时候,都遇到过MySQL与中文不兼容的问题,从前都是凭借尝试与运气解决问题这次好好总结一下:

2046
来自专栏数据和云

【12.2新特性】In-Memory列存储的FastStart管理

启用IM列存储时,In-Memory FastStart通过将IMCU直接存储在磁盘上来优化IM列存储中数据库对象的数量,使数据库通过将列数据存储在磁盘上更快地...

3589

扫码关注云+社区

领取腾讯云代金券