通用寄存器
8086CPU有14个寄存器,他们的名字称为诶:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
8086CPU所有的寄存器都是16位的,可以存放两个字节。
为了保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
AX可以分为 AH还有AL; AH还有AL寄存器是可以独立使用的8位寄存器。
BX可以分为BH还有BL;
CX可以分为CH还有CL;
DX可以分为DH还有DL;
字在寄存器中的存储
一个字可以存在一个16位的寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。
几条汇编指令
汇编指令是不区分大小写的
mov AX,BX 的意思是将BX中的数据放在AX中
add AX,BX 的意思是将BX与AX相加,放在AX中
如果超过数据的存储范围,就会有数据的丢失
这里的丢失,指的就是进位制不能在8位寄存器中保存,但是CPU不是真的丢弃这个进位值。
物理地址
CPU访问内存单元的时候要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。
我们将这个唯一的地址称为物理地址。
决定一个CPU是多少位的,有以下三方面的特点
-
运算器一次最多可以处理16位的数据。
-
寄存器的最大宽度为16位。
-
寄存器和运算器之间的通路是16位的。
8086CPU在读写内存的时候,发生了一些事情: -
CPU中的相关部件提供两个16位的地址,一个称为段地址,另一称为偏移地址
-
段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
-
地址加法器将两个16位地址合并成一个20位的地址。
地址加法器合成物理地址的方法:
物理地址=段地址×16+偏移地址
段的概念
内存并没有分段,段的划分来自于CPU,由于8086CPU用“段地址*16”+偏移地址=物理地址的方式。实际上,内存并没有划分成一个一个的段。
以后在编程的时候,根据需要将若干个地址连续的内存单元看作一个段,用段地址X16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
段的起始地址一定是16的倍数。
偏移地址为16位,所以一个段的长度最大为64k。
CPU可以用不同的段地址还有偏移地址来形成同一个物理地址。
段寄存器
段寄存器就是用来提供段地址的。8086CPU有4个段寄存器:CS、DS、SS、ES
当8086CPU要访问内存的时候,由这4个段寄存器提供内存单元的段地址。
CS和IP
CS和IP是8086CPU中最关键的寄存器,他们指示了CPU当前要读取的指令的地址。
CS为代码段寄存器。用来存放指令的段地址。
IP为指令指针寄存器。用来存放指令的偏移地址。
转移指令
修改CS、IP的内容不能使用MOV指令,而是通过使用 JMP进行的。
jmp 段地址:偏移地址
功能:用指令中给出的段地址修改CS,偏移地址修改IP
jmp 1000:3 表示CS= 1000,IP=3
代码段
可以将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
CPU只认被CS:IP指向的内存单元中的内容为指令。