8086CPU常用的寄存器有AX,BX,CX,DX,DS,CS,ES,SS,IP,SP,SI,DI等。通过学习王爽老师主编的《汇编语言》(第二版)的4-7章,基本上对这些寄存器的使用有了一定的了解,现将这些寄存器的使用总结如下:
在汇编中使用描述符reg来表示一个寄存器,包括ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di
使用描述符sreg表示一个段寄存器,包括ds,cs,ss,es
-----------------------AX,BX,CX,DX,BP,SI,DI---------------------
AX,BX,CX,DX是四个通用寄存器,大小为1个字(两个字节),可以直接读取一个字的内容到这些寄存器中,也可以按字节的方式读取这些寄存器。
以AX为例,如果想要读取AX低位字节的内容,使用AL(A low),想要读取AX高位字节的内容,使用AH(A high)。
如果将1234H存入到AX中,使用mov ax,1234H。这里需要注意的是,34保存在低位,12保存在高位。如果将AX存入到DS中,查看DS内容时,会发现34在前,12在后。因为DS是从低位显示到高位的。
到目前为止,使用AX最多的是将一个内存中的值赋给AX,然后通过AX将内存中的值存入不同的段中(CS,DS,SS,ES等)。因为对这些段的赋值,8086CPU不允许通过内存直接赋值,只能通过一个变量寄存器来间接赋值。
DX的使用和AX类似,有区别的是BX和CX。
BX通常存放的数据用来表示的是数据段DS的偏移地址。如mov ax,[bx]默认的是将ds*16 + bx所表示的物理内存中的数据传递给ax。
CX在程序刚加载的时候,存放的是程序的长度。另外,在使用循环LOOP时,通常是将循环的次数存放在CX中(插一句,如果是多层循环的话,就要考虑使用stack来push和pop来不断的存取CX值,可能这也是stack结构最初的使用吧。现在想想,确实是个很不错的设计)。
DP存放的是段SS的偏移地址。
SI,DI 可以单独使用,若想组合使用只能和BX或者BP组合来使用,如[bx + si],[bp + di]等
----------------------DS,CS,SS,ES段--------------------------
DS存放的是程序在内存中的起始段的段地址。这个段内的前256个字节(100H)存放的是PSP内容(不懂,只了解是存放程序和DOS通信的内容),之后才是程序的第一条指令的地址。而CS:IP指向的是程序执行指令的地址&