AX
8086是16位的微处理器。这意味着,它的所有寄存器也都是16位的,它能一次性处理16位数据。它有4个通用寄存器,分别是AX,BX,CX,DX。他们逻辑结构是一致的,下图展示了AX的结构。
不过这四个寄存器都可以分别作为两个独立的8位寄存器。例如AL作8位寄存器的时候,一旦数据超过FFH就会被丢弃或者是存放在进位位中,而不是把进位位放在上图8这个位置处。
AX分为AH和AL; BX分为BH和BL; CX分为CH和CL; DX分为DH和DL;(H代表高8位,L代表低8位)
从图中可以看到数据在寄存器中的排列顺序。
在进行数据传输或者是运算的时候,需要注意汇编指令的两个操作数的位数应当是一致的。
BX
BX寄存器有一个特殊的功能,就是可以用来做寄存器寻址,例如:
mov ax,2000H
mov ds,ax
mov bx,1000H
mov [bx],ax
上面这段指令将2000H送入内存地址位2000:1000的内存单元。AX,CX,DX寄存器不能这样使用。
上图明确的展示了只有BX寄存器可以这样使用。
CX
CX寄存器中的值影响loop指令的执行。如果我们使用loop指令来实现循环,那么CX寄存器中存放的就是循环次数。下面这个例子展示了使用loop指令结合cx寄存器来求得2^3。
assume cs:code
code segment
mov ax,1
mov cx,3
s: add ax,ax
loop s
mov ax,4c00H
int 21H
code ends
end
在debug下,我们一步一步执行,即可看到AX,CX的值都在变化。如下所示:
可以看到CX寄存器中的值是自动递减的。最后当CX=0000的时候,循环结束。下一条指令变成了MOV AX,4C00,这也说明了CX确实能控制循环的次数。换成别的寄存器就不行了,例如换成BX寄存器。那么上面的代码会一直执行到AX溢出,才停止循环。因此,通常我们的循环代码都会写成如下的格式:
mov cx,循环次数
s: 需要循环执行的代码段
loop s
段前缀
段前缀是明确指出了段地址所在,如下的指令都是.
mov ax,cs:[bx]
mov ax,ds:[bx]
mov ax,ss:[bx]
...