0.寄存器

寄存器是CPU中程序员可以用指令读写的部分,程序员通过改变各种寄存器中的内容来实现对CPU的控制

8086CPU有14个寄存器,每个寄存器有一个名称,这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW

通用寄存器

AX、BX、CX、DX 这4个寄存器可以用来存放一般性数据,被称为通用寄存器

这4个寄存器都是16位的,可以存放两个字节,同时每个寄存器可以分为两个8位寄存器,如AX能够被分为AH(AX的高8位)与AL(AX的低8位)

类似的还有BP、SP、SI、 DI四个寄存器,但这4个寄存器只能以16位模式访问

这些寄存器还能分为以下几类:

  • AX称为累加器(Accumulator),是CPU中使用最多,功能最强,执行效率的寄存器
  • BX、SI、DI与BP被称为基地址寄存器(Base Register),只能用基地址寄存器来作为地址访问内存(例如[bx]),基地址寄存器可以组合出现,如用[bx + di]来访问内存,但要注意只有四种组合: bx&si, bx&di, bp&si, bp&di。
  • CX称为计数寄存器(Count Register),与loop指令配合使用,每loop一次cx减一,当cx == 0时退出loop循环
  • DX称为数据寄存器(Data Register)

段寄存器

8086在访问内存时要通过段地址与偏移地址访问(通过地址加法器最后的地址为:段地址*16 + 偏移地址),段地址储存在段寄存器中。8086有4个段寄存器,分别为:CS、DS、SS、ES。

CS代码段寄存器

CS为代码段寄存器,它与IP(指令指针寄存器)共同指示了CPU当前要读取指令的地址,任意时刻,CPU将CS:IP指向的内容当作指令执行

不能用mov指令修改CS:IP的值,需要用“jmp 段地址:偏移地址”指令来实现修改

也可以使用“jmp 合法寄存器” 来实现用寄存器中的值修改IP

DS数据段寄存器

DS寄存器用来存放要访问的数据的段地址,结合[Address]来实现对内存的访问

例如要将1000H:0的数据(一个字节)读入AX

mov bx, 1000H ;将1000H的段地址写入bx
mov ds, bx    ;将bx的地址写入ds
mov al, [0]   ;从ds:0的位置读写数据写入al

注意8086并不支持直接将数据写入段寄存器,需要用寄存器中转

若要读写一个字(16位),则有 mov ax, [0] 等效于 mov al, [0] 与 mov ah, [1] 两句(当然在8086中可以一次性完成16位的数据传送)

SS栈段寄存器

SS寄存器与SP寄存器共同(组成 SS:SP)指向栈顶元素,可以用pop与push进行栈操作

push 指令由两步完成:

  1. SP -= 2,将SS:SP指向新的栈顶
  2. 将寄存器中的数据送入SS:SP指向的内存单元

pop 指令同样由两步组成:

  1. 将SS:SP指向的内存单元的数据送入寄存器
  2. SP += 2

注意在8086中没有对栈超界的检查,应该注意防止出界。由于push与pop指令只会修改SP,所以栈不会超出SS指向的段(64K)

可以用mov来修改SS:SP的值来设置栈顶位置

发表评论

邮箱地址不会被公开。