寄存器是CPU中用于高速存取暂存数据的存储部件。通过改变寄存器中的数据,可以对CPU的行为进行控制。对于8086CPU,内部共有14个寄存器,位宽均为16位,分别是AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS, DS, ES, PSW。不同的寄存器所起到的作用不同。
1、通用寄存器
通用寄存器指的是AX, BX, CX, DX四个寄存器,可以用于存放通用数据。每一个通用寄存器可以存放16位数据,而由于上一代CPU的寄存器为8位,考虑到兼容性,每一个通用寄存器可以按照高八位和低八位分成两个8为寄存器,名称分别为xH和xL(如AH/AL等)。这分割出来的8位寄存器在使用中都是独立的寄存器。,在数据超过8位的时候会产生溢出。比如AL中的数据如果超过了8位,那么多余出来的位数并不会影响到AH中的数据。通过这样的寄存器结构,CPU可以一次性处理字节Byte和字Word(2字节)两种尺寸的数据。
2、简单汇编指令
汇编语言的指令和寄存器名称不区分大小写。较常用的例如:
mov ax, 18 //将18H存入寄存器ax add ax, bx //将寄存器bx的值与ax相加,存入ax其实只需明白一点就是,操作的结果储存于两个操作数的前者就好了。另外需要注意的是, 两个操作对象的位数必须一致,例如mov ax, bl这样的指令就是错的。
3、CPU位数与物理地址
现在的CPU主流已经是64位,部分老式机器是32位,而8086CPU是16位。对于8086而言,所谓16位CPU指的是,运算器的宽度为16位,即一次可以计算16位的数据,寄存器最大宽度是16位,二者之间的内部总线宽度也是16位。对于32位、64位机器则是同样的道理。
8086的外部地址总线的宽度为20位,寻址能力为1M,因此在实际操作中,需要CPU用16位的数据表示20位的地址。为了实现这样的功能,8086通过提供了两个16位的地址:段地址和偏移地址,由地址加法器将短地址左移四位并与偏移地址相加来合成物理地址。通过这样的方式,CPU将内存地址看做一个整段+一个偏移量的方式来表示,也是因为这样的缘故,一个段的起始地址一定是16的倍数,长度最大是64KB。
4、段寄存器和指令指针寄存器
8086包含四个段寄存器:CS, DS, SS, ES,分别作为代码段寄存器、数据段寄存器、堆栈段寄存器和额外段寄存器。另外IP寄存器作为指令指针寄存器。在任意时刻,CPU从CS×16+IP的内存地址中获取指令并执行,地址可以记为CS:IP。读取完成一条指令后,IP中的值可以根据刚刚读取指令的长度自动增加,使CPU可以轻易读取下一条指令。在刚刚启动时,CS和IP的初始状态为CS = FFFFH,IP = 0000H。
8086的工作流程如:
- 从CS:IP中读取指令,进入指令缓冲器;
- IP向下移动指令长度,指向下一条指令;
- 执行,循环这个过程。
修改CS和IP寄存器采用jmp命令:
jmp MMM:NN //将CS修改为MMM,将IP修改为NN jmp NN //不改动CS,将IP修改为NN