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

CPU和寄存器概述

  • CPU概述:一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
    区别:
    内部总线实现CPU内部各个器件之间的联系。
    外部总线实现CPU和主板上其它器件的联系。
  • 寄存器概述:
    8086CPU有14个寄存器 (其中有八个通用寄存器)它们的名称为:
    AX、BX、CX、DX、SI、DI、SP、BP、
    IP、CS、SS、DS、ES、PSW。

2.1 通用寄存器

8086CPU所有的寄存器都是16位的,可以存放两个字节。 x86

AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。(后面是X,都是16位,32位是EAX)

下面以AX为例,我们看一下寄存器的逻辑结构。
在这里插入图片描述
一个16位寄存器可以存储一个16位的数据。(数据的存放情况)

例1:
数据:18
二进制表示:10010
在寄存器AX中的存储:
18在寄存器AX中的存储
例2:
数据:20000
二进制表示:0100111000100000
在寄存器AX中的存储:
20000在寄存器AX中的存储
一个16位寄存器所能存储的数据的最大值为多少?
答案:216-1。

8086上一代CPU中的寄存器都是8位的;

16位是划时代的产物,16位物理地址是段地址加偏移地址

为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
(H是高位,L是低位)

  • AX可以分为AH和AL;
  • BX可以分为BH和BL;
  • CX可以分为CH和CL;
  • DX可以分为DH和DL。

8086CPU的8位寄存器存储逻辑
以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况:
8086CPU的8位寄存器存储逻辑
AX的低8位(0位-7位)构成了AL寄存器,高8位(8位-15位)构成了AH寄存器。
AH和AL寄存器是可以独立使用的8位寄存器。

一个8位寄存器所能存储的数据的最大值是多少?
答案:28-1。

8086CPU的8位寄存器数据存储情况如下:
8086CPU的8位寄存器数据存储情况

2.2 字在寄存器中的存储

一个字(word)可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。
1word = 2B = 2Byte = 16bit(位)
在这里插入图片描述

关于数制的讨论

由于一个内存单元可以存放 8位数据,CPU中的寄存器又可存放 n 个 8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。

用十六进制(后加H)来表示数据可以直观的看(二进制后加B)
出这个数据是由哪些8位数据构成的。
每两位对应一个八进制!

(bin文件里就是源程序)

任何数据,到了计算机中都是以二进制的形式存储的

2.3 几条汇编指令

在这里插入图片描述
汇编指令不区分大小写!!

CPU执行下表中的程序段的每条指令后,对寄存器中的数据进行的改变
在这里插入图片描述
?处为1044C,只有16位,因此为044C H ,多出的高位上的1放到了进制位中

在这里插入图片描述
最后问号处:C5+93 = 158
低八位存放0058H
如果是add ax,93H 那AX结果应该是0158H

这里的丢失,指的是进位制不能在 8 位寄存器中保存,但是 CPU 不是并真的不丢弃 这个进位值,这个问题会在后面的课程中讨论。

检测点2.1

在这里插入图片描述
mov ax ,0002h
add ax,ax
add ax,ax
add ax,ax

2.4 物理地址

CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。

我们将这个唯一的地址称为物理地址。

2.5 16位结构的CPU

概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
1、运算器一次最多可以处理16位的数据。

2、寄存器的最大宽度为16位。

3、寄存器和运算器之间的通路是16位的。

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

8086有20位地址总线,可传送20位地址,寻址能力为1M(=220)。

8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

问题:那么,8086CPU如何用内部16位的数据
转换成20位的地址呢?

自问自答:8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址~
在这里插入图片描述
8086CPU读写内存时,发生了这么一些事:

  • CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
  • 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
  • 地址加法器将两个16位地址合并成一个20位的地址; ……

地址加法器合成物理地址的方法:
物理地址=段地址×16+偏移地址

例如:
8086CPU访问地址为123C8H的内存单元
在这里插入图片描述
“段地址×16”有一个更为常用的说法就是数据左移4位。(二进制位)
在这里插入图片描述

我们通过观察移位次数和各种形式数据的关系:

(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
(3)地址加法器如何完成段地址×16的运算?
以二进制形式存放的段地址左移4位。

经过进一步的思考,我们可以看出:

  • 一个数据的十六进制形式左移1位,相当于乘以16;
  • 一个数据的十进制形式左移1位,相当于乘以10;
  • 一个数据的X进制形式左移1位,相当于乘以X。

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

8086 x86开始

两个比喻说明:

  1. 说明“基础地址+偏移地址 = 物理地址” 的思想:第一个比喻
    在这里插入图片描述(1)从学校走2826m到图书馆。这2826可以认为是图书馆的物理地址。
    (2)从学校走2000m到体育馆,从体育馆再走826m到图书馆。
    第一个距离2000m是相对于起点的基础地址;
    第二个距离826m是将对于基础地址的偏移地址。

  2. 说明“段地址×16+偏移地址=物理地址”的思想:第二个比喻
    8086CPU就是这样一个只能提供两张3位数据纸条的CPU。
    在这里插入图片描述
    在这里插入图片描述

2.8 段的概念

错误认识:
内存被划分成了一个一个的段,每一个段有一个段地址。

其实:
内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
在这里插入图片描述
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

两点需要注意
(1)段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;
(2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。

内存单元地址小结

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

检测点2.2

在这里插入图片描述
(1)0010H + 0000H = 0001H
0010H + FFFFH = 1000FH
(2)SA * 16 + X = 20000H
Xmin = 0000H SA = 2000H
Xmax = FFFFH SA = 1001H
(3)<1000H

2.9 段寄存器

段寄存器就是提供段地址的。
8086CPU有4个段寄存器:
CS、DS、SS、ES

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

2.10 CS和IP

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

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

在这里插入图片描述

在这里插入图片描述

在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

2.11 修改CS、IP的指令

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
转移指令如下
在这里插入图片描述
jmp 3:0B16
00030H + 0B16H = 00B46H
在这里插入图片描述
在这里插入图片描述
初始CS=2000H 寻找地址20000H ,执行mov ax,6622H ,IP+3,因为有三个字节,
执行jmp 1000:3 CS的值成为1000H IP=3
跳转到地址10003H 执行mov ax,0000 IP+3
执行mov bx , ax ,此时bx = 0000H
执行jmp bx ,bx 只修改IP的值,CS不变 CS仍然是1000H
跳转到地址10000H+0000H = 10000H
执行mov ax,0123H IP+3
循环
在这里插入图片描述

2.12 代码段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

在这里插入图片描述
如何使得代码段中的指令被执行呢?
将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。

CPU 只认被 CS:IP 指向的内存单元中的内容为指令。

所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。
如刚才的CS = 123BH,IP = 0000H。

小结

在这里插入图片描述
在这里插入图片描述

检测点2.3

在这里插入图片描述

实验1 查看CPU和内存,用机器指令和汇编指令编程

BEBUG

  • R命令查看、改变CPU寄存器的内容;
  • D命令查看内存中的内容;
  • E命令改写内存中的内容;
  • U命令将内存中的机器指令翻译成汇编指令;
  • T命令执行一条机器指令;
  • A命令以汇编指令的格式在内存中写入一条机器指令。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
往显存里写数据,写进什么就输出什么
eg : 34对应十进制52,对应ASCII码4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

holdoulu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值