文章目录
第2章 寄存器
CPU由运算器、控制器、寄存器等器件构成,靠内部总线相连
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各器件进行工作
- 内部总线连接各个器件,在它们之间进行数据的传送
8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、CS、SS、DS、ES、PSW
2.1 通用寄存器
8086CPU所有寄存器都是16位的,存放两个字节
AX、BX、CX、DX称为通用寄存器,都可以分为两个独立的8位寄存器使用
例:通用寄存器AX可分为AH和AL,AX低8位构成AL寄存器,高8位构成AH寄存器
2.2 字在寄存器中的存储
8086CPU存在两种尺寸的数据:
- 字节:byte,由8个bit组成
- 字:word,一个字由两个字节组成,分别称为高位5字节和低位字节
为了区分不同进制,十六进制表示的数据后面加H,二进制表示的数据后面加B,十进制的数据后面什么也不加
2.3 几条汇编指令
传送指令MOV
MOV A,B
(A)<-(B)
mov ax,18 将18送入寄存器AX
mov bl,[2000H] 将2000H单元的内容送入BL寄存器
mov ch,‘a’ 将a的ASCII码送入CH寄存器
mov指令可以在CPU内或者CPU和寄存器之间传送字或者字节的数据
加法指令 ADD
ADD A,B
(A)<-(A)+(B)
除源操作数为立即数的情况,源操作数和目的操作数必须有一个寄存器寻址方式
2.4 物理地址
所有的内存单元都有一个唯一的地址,我们将这个唯一的地址称为物理地址
2.5 16位结构的CPU
16位结构的CPU:
- 寄存器一次最多可以处理16位的数据
- 寄存器的最大宽度是16
- 寄存器和运算器的通路宽度是16位
即一次性可以处理、传输、暂存的信息最大长度是16位的
2.6 8086CPU给出物理地址的方法
8086CPU有20位地址总线,1MB的寻址能力
8086CPU是16位结构,一次性处理、传输、暂存的地址是16位
8086CPU采用在内部两个16位地址合成的方法来形成20位的物理地址
逻辑结构:
- CPU提供两个16位的地址,一个为段地址,一个为偏移地址
- 段地址和偏移地址通过内部总线送入地址加法器部件
- 地址加法器采用物理地址=段地址×16+偏移地址的方法合成一个20位物理地址
- 地址加法器通过内部总线将20位物理地址送人输入输出控制电路
- 输入输出控制电路将20位物理地址送到地址总线
- 20位物理地址被地址总线传送到存储器
2.8 段的概念
内存并没有分段,段的概念来着CPU
我们可以认为:地址10000H~100FFH的内存单元组成一个段,起始地址位10000H,段地址为1000H,大小为100H
编程需要可以把连续的内存单元划分成段,用段地址×16定位段的起始地址用偏移地址定位段中的内存单元
起始地址一定是16倍数,一个段的长度最大为16位(偏移地址位16位)
数据在21F60H内存单元中可描述为:
- 数据在内存2000:1F6O单元中
- 数据在内存的2000H段的1F6O单元中
2.9 段寄存器
4个段寄存器:CS、DS、SS、ES
访问内存时提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址
2.10 CS和IP
CS为代码段寄存器,IP为指令指针寄存器
任意时刻,8086CPU将从内存CS中内容×16+IP中内容单元开始,读取指令并执行
** 如下是8086CPU读取、执行一条指令的过程:**
8086CPU工作流程简要描述:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP=IP+所读取的长度,从而执行下一条指令
- 执行指令,转步骤1,重复过程
2.11 修改CS、IP的指令
能够改变CS、IP的指令被统称为转移指令(jmp指令)
同时修改CS:IP内容:jmp 段地址:偏移地址
仅修改IP内容:jmp 合法寄存器
2.12 代码段
我们将一组内存单元定义为一个段,将长度为N(N<=64KB)的一组代码存放在地址连续、起始地址为16的倍数的内存单元中,即可以认为,这是一个代码段。
设置CS:IP的值可以执行这段代码
实验1 查看CPU和内存,用机器指令和汇编指令编程
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具
但是后来的Windows不再包含debug这个命令,为了实现模拟dos环境的debug,使用DosBox+debug
- 安装DosBox后把debug.exe放在一个文件夹下
- 运行DosBox输入命令mount c f:\c将文件夹挂载到c盘上,其中f:\c是你的debug所在的文件夹,
- 输入命令C:切换到C盘
- 然后就可以执行debug的命令了
如果不想每一次运行都输入这样的命令可以在DosBox下修改如下选中文件,在文件末尾添加你在程序开启后执行的命令