自学王爽老师《汇编语言》笔记——第2章 寄存器
第2章 寄存器
一个典型的CPU由 运算器、控制器、寄存器 等器件构成,这些器件靠内部总线相连。
内部总线和外部总线:
内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其它器件的联系。
CPU中部件及其作用:
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件正常工作
- 内部总线连接各个器件,在他们之间进行数据的传送
寄存器:
- 对一个汇编程序员来说,CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。
- 不同的CPU,寄存器的个数、结构是不相同的。
- 8086CPU有14个寄存器,每个寄存器都是16位的,且各自有各自的名字。
2.1 通用寄存器
在8086CPU中,AX、BX、CX、DX这四个寄存器通常用来存放一般性的数据,被称为通用寄存器。
为兼容上代8位CPU,8086CPU的AX~DX这四个寄存器都可以分为两个可独立使用的8位寄存器来使用。
分别分为 (AH,AL) ~ (DH,DL)。
2.2 字在寄存器中的存储
出于对兼容性的考虑,8086CPU可以一次性处理两种尺寸的数据:
- 字节:记为byte, 一个字节由8个bit组成。
- 字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。
2.3 几条汇编指令
几条汇编指令:
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
---|---|---|
mov ax, 18 | 将18送入寄存器AX | AX=18 |
mov ah, 78 | 将78送入寄存器AH | AH=78 |
add ax, 8 | 将寄存器AX中的数值加上8 | AX=AX+8 |
mov ax, bx | 将寄存器BX中的数据送入寄存器AX | AX=BX |
add ax, bx | 将AX和BX中的数值相加,结果存放在AX中 | AX=AX+BX |
2.4 物理地址
所有内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
2.5 16位结构的CPU
16位结构(16位机、字长为16位等常见说法,与16位结构的含义相同)描述了一个CPU具有以下结构特性:
- 运算器一次最多可以处理16位的数据
- 寄存器的最大宽度位16位
- 寄存器和运算器之间的通路为16位
16位结构的CPU能够一次处理、传输、暂时存储的信息的最大长度是16位的。
内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,所以对于16位CPU能一次性处理、传输、暂时存储16位的地址。
2.6 8086CPU给出物理地址的方法
- 8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。
- 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
- 8086CPU相关部件的逻辑结构如下图
- 地址加法器合成物理地址运算规则:物理地址 = 段地址 * 16 + 偏移地址
- 地址加法器的工作过程
由 段地址*16 引发的讨论:一个数据的二进制左移N位,相当于该数据乘以2的N次方
2.7 "段地址 * 16 + 偏移地址 = 物理地址"的本质含义
这里讨论的是8086CPU段地址和偏移地址的本质含义,而非更高级的逻辑意义。
“段地址 * 16 + 偏移地址 = 物理地址”的本质含义是:
CPU在访问内存时,用一个基础地址(段地址 * 16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般的说,8086CPU的寻址功能是“基础地址 + 偏移地址 = 物理地址”寻址模式的一种具体实现。
2.8 段的概念
其实,内存并没有分段,段的划分来自于CPU的计算内存单元物理地址的方法。以后在编程时可以根据需要将若干地址连续的内存单元看做是一个段。
- 一个段的起始地址一定是16的倍数
- 偏移地址为16位,16位地址的寻址能力为64K B,所以一个段的最大长度最大为64KB
- CPU可以用不同的段地址和偏移地址形成同一个物理地址
2.9 段寄存器
段地址在8086CPU中的段寄存器中存放。8086CPU中有4个段寄存器:CS、DS、SS、ES。
2.10 CS和IP
- CS和IP是8086CPU中两个最为关键的寄存器,它们指示了CPU当前要读取指令的地址。
- CS为代码段寄存器,IP为指令指针寄存器。
- 8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
- 8086PC读取和执行指令的相关部件
8086CPU的工作过程简要描述如下:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓存器;
- IP = IP + 所读取指令的长度,从而指向下一条指令;
- 执行指令。转到步骤1,重复这个过程。
在8086CPU刚开始工作时,CS和IP被设置为CS=FFFFH,IP=0000H。
即FFFF0H单元中的指令是8086PC开机后执行的第一条指令。
2.11 修改CS、IP的指令
- 在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
- 8086CPU中大部分寄存器的值都可以通过mov指令来改变,mov指令被称为传送指令。
- mov指令不能用于设置CS和IP中的值。
- 能够改变CS和IP的内容的指令被统称为转移指令。
- 最简单的可以修改CS、IP的指令:jmp指令
- 同时修改CS、IP的内容:jmp 段地址:偏移地址
- 仅修改IP的内容(用寄存器中的值修改IP):jmp 某一合法寄存器
2.12 代码段
- 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
- 要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。
实验1
1. 预备知识:Debug的使用
(1). 什么是Debug?
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
(2). 我们用到的Debug功能
- 用Debug的R命令查看、改变CPU寄存器的内容;
- 用Debug的D命令查看内存中的内容;
- 用Debug的E命令改写内存中的内容;
- 用Debug的U命令将内存中的机器指令翻译成汇编指令;
- 用Debug的T命令执行一条机器指令;
- 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。