当前位置:网站首页>王爽汇编语言详细学习笔记二:寄存器

王爽汇编语言详细学习笔记二:寄存器

2022-07-06 09:24:00 Deteriorate_Kr

课件来源处


前言

一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
内部总线实现CPU内部各个器件之间的联系。
外部总线实现CPU和主板上其它器件的联系。
简单地说,在CPU中:
1.运算器进行信息处理
2.寄存器进行信息存储
3.控制器控制各种器件进行工作
4.内部总线连接各种器件,在他们之间进行数据的传送



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

8086CPU有14个寄存器 它们的名称为:
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW。


一、通用寄存器

8086CPU所有的寄存器都是16位的,可以存放两个字节。
AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。

下面以AX为例,我们看一下寄存器的逻辑结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8086上一代CPU中的寄存器都是8位的;
为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。

AX可以分为AH和AL;
BX可以分为BH和BL;
CX可以分为CH和CL;
DX可以分为DH和DL。
H是高位,High
L是低位,Low
高位←低位

AX的低8位(0位~ 7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。
AH和AL寄存器是可以独立使用的8位寄存器。
在这里插入图片描述
在这里插入图片描述





二、字在寄存器中的存储

字节:byte,一个字节由8个bit组成,可以存在8位寄存器中
字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节
在8086的AX寄存器中,在AH中存储了它的高8位,在AL中存储了它的低8位。AH和AL中的数据,既可以看成是一个字型数据的高8位和低8位,也可以看成是两个独立的字节型数据。
由于一个内存单元可以存放 8位数据,CPU中的寄存器又可存放 n 个 8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。
用十六进制来表示数据可以直观的看出这个数据是由哪些8位数据构成的



三.几条汇编指令

在这里插入图片描述
mov ax,18=MOV AX,18
bx=BX…




在这里插入图片描述
本来ax应该=1044c,但别忘了AX是16位寄存器,1044c有20位,所以这里要舍去高位1,留下044c。所以AX=044CH。



在这里插入图片描述
AL=C5H+93H=158H,但AX是16位寄存器。AL只能存放八位数据,所以AL要舍去高位1,留下58,所以AL=18H。AX=0058H



注意:1.此时al是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行这条指令时认为ah和al是两个不相关的寄存器。
2.这里的丢失,指的是进位制不能在 8 位寄存器中保存,但是 CPU 并不是真的丢弃 这个进位值,这个问题会在后面的课程中讨论。
3.在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的例如:
mov ax,bx
mov bx,cx
mov ax,18h
mov al,18h
add ax,bx
add ax,20000等都是正确的指令,而:
mov ax,bl (在8位寄存器和16位寄存器之间传送数据)
mov bh,ax (在16位寄存器和8位寄存器之间传送数据)
mov al,20000 (8位寄存器最大可存放255的数据)
add al,100H (将一个高于8位的数据加到一个8位寄存器中)
等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致






四.地址

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



1. 16位结构的CPU

8086CPU是16位机,而它的上一代(8080、8085)等是8位机。
概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
1、运算器一次最多可以处理16位的数据。

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

3、寄存器和运算器之间的通路是16位的。
也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位。内存单元的地址再送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存放16位的地址。





2. 8086CPU给出物理地址的方法

8086有20位地址总线,可传送20位地址,寻址能力为1M。
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
在这里插入图片描述
当8086CPU要读写内存时,
1.CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
2.段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
3.地址加法器将两个16位地址合成为一个20位的物理地址
4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路
5.输入输出控制电路将20位物理地址送上地址总线
6.20位物理地址被地址总线传送到存储器

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

在这里插入图片描述
在这里插入图片描述
“段地址x16”有一个更为常用的说法是左移4位。计算机中的所有信息都是二进制的形式存储的,段地址当然也不例外。机器只能处理二进制信息,“左移4位”中的位,指的是二进制位。
观察移位次数和各种形式数据的关系:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
(3)地址加法器如何完成段地址×16的运算?
以二进制形式存放的段地址左移4位。
规律:**一个数据的十六进制形式左移1位,相当于这个数据对应的十进制形式乘以16,也相当于这个数据对应的十六进制形式乘以10H(10H=10);**一个数据的十进制形式左移1位,相当于这个数据的对应的十进制形式乘以10;一个X进制的数据左移1位,相当于这个数据对应的十进制形式乘以X。一个X进制的数据左移N位,相当于这个数据对应的十进制形式乘以X的N次方。二进制左移4位相当于16进制左移一位





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

它的本质含义是:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般的说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址x16可看做是寄出地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在第一张纸上写上200(段地址),在第二张纸上写上826(偏移地址)。然后200(段地址)x10+826(偏移地址)=2526(物理地址)





4.段的概念,真实内存没有被分段,段的划分来自于CPU

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。





5.内存单元地址小结


比如CPU要访问21F60H单元,则它给出的段地址SA和偏移地址EA满足SAX16+EA=21F60H即可。
在这里插入图片描述
在这里插入图片描述
习题:
有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为____,最大为____。
首先偏移地址EA的范围为0H~FFFFH
所以最大的SA=(20000H-0H)/10H=2000H
最小的SA=(20000H-FFFFH)/16(o)=1001H
20000H=131072
FFFFH=65535
(131072-65535)/16=4,096.0625,有余数,向上取整,取到4097
4097=1001H,所以SA的最小值为1001H






五.段寄存器

段寄存器就是提供段地址的。
8086CPU有4个段寄存器:
CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(附加段寄存器)
当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。

1.CS和IP

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
CS为代码段寄存器;
IP为指令指针寄存器。
8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行,而且找到地址后IP会自动递增
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。
CPU根据什么将内存中的信息看作指令?
CPU将CS:IP指向的内存单元中的内容看作指令。

在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。





2.修改CS、IP的指令

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
我们如何改变CS、IP的值呢?
8086CPU必须提供相应的指令
先回想我们如何修改AX中的值?用mov指令,其实8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令是传送指令。
但mov指令不能用于设置CS、IP的值,因为8086CPU没有提供这样的功能

8086CPU为CS、IP提供了另外的指令来改变它们的值:jmp转移指令
1.若想同时修改CS、IP的内容:
jmp 段地址:偏移地址
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取命令
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取命令
功能:用指令中给出的段地址修改CS,偏移地址修改IP。




2.仅修改IP的内容:
jmp 某一合法寄存器
jmp ax (类似于 mov IP,ax)
jmp bx
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





3.问题分析

在这里插入图片描述
初始状态下CS=2000H,IP=0000H,物理地址=CSx16+IP=20000H。
1.首先执行 mov ax,6622H
2.IP自增,执行 jmp 1000:3
3.此时CS=1000H,IP=0003H,转到1000x16+0003=10003H处执行
mov ax,0000
4.IP自增,mov bx,ax 。此时bx=ax=0000H,
5.jmp bx ,此时IP=0000H,CS=1000H
6.转到10000H处执行 mov ax,0123H
7.执行第三步
所以总结下来,结果为:
(1)mov ax,6622
(2)jmp 1000:3
(3)mov ax,0000
(4)mov bx,ax
(5)jmp bx
(6)mov ax,0123H
(7)转到第(3)步执行





4.代码段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段
mov ax,0000 (B8 00 00)
add ax,0123H (05 23 01)
mov bx,ax (8B D8)
jmp bx (FF E3)
这段长度为 10 字节的字节的指令,存在从123B0H~ 123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存单元是用来存放代码的 ,是一个代码段 ,它的段地址为123BH,长度为10字节。
如何使得代码段中的指令被执行呢?
将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。
CPU 只认被 CS:IP 指向的内存单元中的内容为指令。
所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。
CS = 123BH,IP = 0000H。






5.小结

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


原网站

版权声明
本文为[Deteriorate_Kr]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_53213086/article/details/125612263