寄存器

1.通用寄存器

一个典型的CPU由运算器,控制器和寄存器几部分构成,这些器件靠内部总线连接。程序员可以通过修改寄存器的数据,来实现对CPU的控制。不同CPU的寄存器的结构,数量都不相同。8086CPU所有的寄存器都是16位的,可以存放两个字节。AX,BX,CX,DX这四个寄存器一般用来存放一般性数据,称为通用寄存器
由于上一代CPU都是8位,出于兼容性考虑,将通用寄存器分为两个8位寄存器。如AX由AH和AL组成,例如:
寄存器AX中的数据为3412H,[AH]=34H,[AL]=12H
在数据运算和传输的时候,操作对象位数应该一致。

2.物理地址的产生

由于8086CPU的地址总线有20位,而内部总线只有16位,8086CPU有一套独特的计算物理地址的方法,可以通过两次16位数据的传输加权算出20位的地理地址:
物理地址=段地址*16+偏移地址
乘以16是因为地址都是16进制计算,相当于让段地址左移一位,然后在这个基础上偏移。

3.数据的基本知识

3.1字的存储

低位字节存在低地址,高位字节存在高地址,起始地址为N的字单元简称N地址单元。

3.2mov,sub,add指令的用法

三者用法基本一致,具体情况如图:
在这里插入图片描述

4.段寄存器

段的划分来源于CPU,在编程时可将一段连续地址视为段。受16位寻址能力影响,段的最大长度位64KB(216B)。也由于段地址要乘一个16,所以段首地址必为16的倍数。这里要理解一下,记住这些话都是基于16进制而言,不要用十进制的思维去看待,比如2200H就是16的整数倍。

  • 代码寄存器CS,指针寄存器IP。CS:IP对应的数据会被认定为指令,计算机读取对应地址的数据,识别指令长度,然后IP自动加上指令长度,以这样的方式实现读取下一条指令。
  • 对CS:IP的修改只能用jmp指令,全修改:jmp 段地址:偏移地址;只修改IP:jmp 某个合法寄存器。
  • 访问数据的DS。在读取数据时默认以DS内的数据为段地址。
  • 栈SS:SP。栈遵守LIFO原则,也就是后进先出。基本操作为入栈PUSH,出栈POP。要注意,栈的所有操作对象都是,不是字节。当入栈时,先SP=SP-2,再放数据;出栈时,先出数据,再SP=SP+2.
    可以看出空栈的时候,SP其实是比栈空间的上界大一