目录
引言
- CPU由运算器、控制器、寄存器等器件组成,靠内部总线相连。
- 内部总线实现CPU内部各器件之间的联系;外部总线实现CPU和主板上其他器件的联系。
- 在CPU中:
- 运算器进行信息处理;
- 寄存器进行信息存储;
- 控制器控制各种器件进行工作;
- 内部总线连接各种器件在它们之间进行数据的传送。
2.1 通用寄存器
8086 CPU所有的寄存器是16位,可以存放2个字节(一个字)。
8086有14个寄存器:
- AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、CS、ES、PSW。
- AX、BX、CX、DX通常用来存放一般性数据,被称为通用寄存器。
- 为保证兼容性,8086 CPU的通用寄存器可以分为两个独立的8位寄存器使用。例: AX可分为AH和AL。
2.2 字在寄存器中的存储
出于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据:
- 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
- 字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个字的高8位寄存器和低8位寄存器中。
- 20000写成十六进制4E20就可以直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL里是20。
十六进制与二进制:
- 0100 1110 0010 0000可表示成:4(0100)、E(1110)、2(0010)、0(0000)。
- 在十六进制表示的数据后面加H,在二进制表示的数据后面加B。
2.3 几条汇编指令
汇编指令对大小写不敏感。
汇编指令举例
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
mov ax,18 | 将8送入AX | AX=18 |
mov ah,78 | 将78送入AH | AH=78 |
add ax,8 | 将寄存器AX中的数值加上8结果存入AX中 | AX=AX+8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=BX |
add ax,bx | 将AX,BX中的内容相加结果存入AX中 | AX=AX+BX |
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。
检测点2.1
mov ax,2 AX=2
add ax,ax AX=4
add ax,ax AX=8
add ax,ax AX=16
2.4 物理地址
- 所有的内存单元构成一个一维的线性存储空间。
- CPU访问内存单元时要给出内存单元的唯一地址就是物理地址。
2.5 16位结构的CPU
- 运算器一次最多可以处理16位数据。
- 寄存器的最大宽度为16位。
- 寄存器和运算器之间的通路是16位。
对于16位CPU,能一次性处理、传输、暂时存储16位的地址。
2.6 8086CPU给出物理地址的方法
- 8086有20位的地址总线,可以传送20位地址,寻址能力为1M;但8086内部为16位结构,只能传送16位的地址。
- 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
- 8086CPU读写内存的步骤:
- CPU中的相关部件提供段子和偏移地址这两个16位的地址;
- 段地址和偏移地址通过内部总线送入到一个称为地址加法器的部件;
- 地址加法器将两个16位地址合并成一个20位的地址;
- 地址加法器通过内部总线将20位物理地址送送入输入输出地址;
- 输入输出控制电路将20位物理地址送上地址总线;
- 20位物理地址被地址总线传送到存储器。
地址加法器工作原理:物理地址=段地址*16+偏移地址。
- 段地址*16就是数据左移4位(二进制)
移位位数 | 二进制 | 十六进制 | 十进制 |
0 | 10B | 2H | 2 |
1 | 100B | 4H | 4 |
2 | 1000B | 8H | 8 |
3 | 10000B | 10H | 16 |
4 | 100000B | 20H | 32 |
一个数据的二进制形式左移N位,相当于该数据乘以2的N次方。
一个数据X进制形式左移N位,相当乘以X的N次方。
2.7 “段地址*16+偏移地址=物理地址”的本质含义
CPU可以通过不同的段地址和偏移地址形成一个相同的物理地址。
2.8 段的概念
- 人为定义的,将若干地址连续的内存单元看作一个段。用段地址*16定位段的起始地址(基址),用偏移地址定位段中的内存单元。
- 一个段的起始地址是16的倍数。偏移地址为16位,寻址能力为64KB,所以段的最大长度也是64KB。
- 如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可定位多少个内存单元?
- 结论:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。比如给定地址1000H,用偏移地址寻址,CPU寻址范围为:10000H~1FFFFH.
- 在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址。
2.9 段寄存器
8086 CPU有4个段寄存器:CS(代码段)、DS(数据段)、SS(堆栈段)、ES(附加段),这4个段提供给8086CPU内存单元的段地址。
2.10 CS和IP
- CS(代码段寄存器) 和IP(指令指针寄存器) 是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
- 在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。
- 在任意时刻CPU将CS:IP指向的内容当作指令执行。
- 8086CPU工作过程的简要概述:
- 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
8086PC机刚开始启动时,CPU从内存FFFF0h单元中读取指令执行,FFFF0h单元中的指令时8086PC机开机后执行的第一条指令。
- IP=IP+所读取指令的长度,从而正确的指向下一条指令;
- 执行指令。转到步骤1,周而复始。
2.11 修改CS、IP的指令
在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
- mov指令(传送指令) 可以改变8086CPU大部分寄存器的值,但不能用于设置CS、IP的值
- jmp指令(转移指令) 可以用来同时修改CS和IP的值,格式为
- jmp 段地址:偏移地址(同时修改CS和IP):用指令中给出的段地址修改CS,偏移地址修改IP。
- jmp 某一合法寄存器(仅修改IP):用寄存器中的值修改IP。
2.12 代码段
- 对于8086PC机,在编程时可以将长度为N(N小于等于64KB)的一组代码存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
- 利用CS:IP来指向内存单元从而让CPU执行其中的内容。
使用Debug
-
可以使用汇编金手指查阅指令。
- R命令查看、改变CPU寄存器的内容;
- D命令查看内存中的内容;
- E命令改写内存中的内容;
- U命令将内存中的机器指令翻译成汇编指令;
- T命令执行一条机器指令;
- G命令跳转到偏移地址;
- P命令结束循环或者是int 21H时是退出程序;
- A命令是以汇编指令的格式在内存中写入一条机器指令。