第二节课 寄存器
1. 寄存器的定义: 进行信息储存的器件,是CPU中程序员可以读写的部件,通过改变各种寄存器中的内容来实现对CPU的控制
2. 寄存器的种类: 本节课学习通用寄存器和段寄存器
2.1 通用寄存器
8086CPU中,所有的寄存器都是16位的,可以存放两个字节。AX,BX,CX,DX这四个寄存器通常用来存放一般性的数据,被称为通用寄存器。
8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,AX,BX,CX,DX这四个寄存器都可以分为两个8位的小寄存器来用。8086CPU可以一次性处理字节和字,字节(byte)是8个bit组成;字(word)是由两个字节组成(高位字节和低位字节)
例如,AX分为AH和AL (高位和低位)AH为高8位,从00H到FFH,AL为低8位,从00H到FFH。两个按照AX=AH*100H+AL组合在一起。但是在对于AL、AH的单独运算中,产生进位是不予考虑的,比如单独对AL做加法,产生的进位不会加到AH里面,AH的进位也不予添加(超出AX范围了)。但是对于AX的计算考虑在AX范围内的进位,超出AX范围不考虑(直接舍去)。
2.2 物理地址和计算物理地址的方法
CPU访问内存单元,需要给出内存单元的地址,这个唯一的地址为物理地址。
8086CPU为16位结构的CPU机,意味着运算器一次性最多能处理16位的数据,寄存器的最大宽度为16,寄存器于运算器之间的通路为16位,但是8086CPU地址总线为20 位,达到1M的寻址能力,所以内部采用两个16位地址合成的方法来形成物理地址。
CPU中的相关部件提供段地址和偏移地址,段地址和偏移地址通过地址加法器进行 物理地址=段地址*10H+偏移地址 的合成方法产生物理地址,通过内部总线将20位物理地址送入输入输出控制电路,再将物理地址送入地址总线,被传送到储存器。
由于段地址是16进制的,故而只要左移一位加上偏移地址即可。
2.3 内存分段化和段寄存器
将内存分段操作,要找的物理地址在段中,以段起始地址/10H为段地址,由于16位地址的寻址能力为64KB,段的大小在64KB(10000H B)内。因此偏移地址为0~FFFFH之间
例如:有一个数据存放在内存20000H单元中,现在给定段地址为SA,若想用偏移地址选找到此单元,则SA应满足的条件为:最小为1001H,最大为2000H。 解析:由于偏移地址为0~FFFFH之间,故而最大值为(2000H*10H-0H)/10H=2000H;而最小值为(2000H*10H-FFFFH)/10H,但是由于2000H*10H-FFFFH=10001H不为10H的整数倍,所以取进一位的10010H,故而最小值为 10010H/10H=1001H
段寄存器就是存放段地址的寄存器,8086包括4个:CS,DS,SS,ES
CS和IP寄存器:CS为代码段寄存器,IP为指令指针寄存器。 8086CPU从以 CS*10H+IP 为地址的内存单元开始当作指令执行(即把CS:IP的指向的内容当作指令)。每次读取一个指令,IP自动加上指令的字数(代码段的长度)作为读取下一个指令的首地址。
可以修改CS,IP的指令,例如:
jmp 2AE3:3 执行后,CS=2AE3H,IP=0003H
jmp ax 执行后,IP会替换成ax储存的内容
注意!8086CPU加电启动或者复位后(即CPU刚开始工作时),CS和IP被设置为(FFFFH:0000H)所以,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。而且,CPU把CS:IP指向的内存单元内容看作指令。如果内存中的一段信息被CPU执行过的话,它所在的内存单元必定被CS:IP指向过。任意时刻,8086CPU将CS:IP指向的内容当作指令执行。
几个简单的汇编指令:
mov ax,4e20h 把4e20h加到ax中
sub ax,4e20h 把ax中的数据减去4e20h
mov ax,bx 把ax中的数减去bx中的数,并且储存在ax中