寄存器(内部访问)
内存中字的储存
我们之前提到过,字由两个字节组成,当我们用16位寄存器来储存时,把字分别储存在连续的两个内存单元中,高位字节放在高地址单元中,低位字节则放在低位地址单元中。
例如上图,0、1两个单元存放了20000(4E20H),这两个单元可以看成起始地址为0的字单元,这里提出了字单元这个概念:存放一个字的两个内存单元。同理,我们不止可以将0、1看作一个字单元,也可以将2、3看作一个字单元,任意两个连续的内存单元组成一个字都可以看成字单元,默认编号小的作为高地址。
DS和[address]
之前提到过,要读写一个单元时要先给出目标内存单元的地址,8086CPU中内存物理地址由段地址x16+偏移地址形成,其实这句话并不完整,8086CPU中DS寄存器通常用来存放要访问的数据的段地址,之前说到过CS寄存器与IP寄存器联用指示要读取的指令的内存单元的物理地址,而DS寄存器区别于CS寄存器的是DS寄存器与如 BX、SI、DI寄存器联用用来指示数据的内存单元的物理地址,这也就解决了内存中所有数据不论是数据还是指令都以二进制数形式存在却能运用的问题。
由于8086CPU的硬件设置问题,8086CPU不支持将数据直接送入段寄存器的操作,我们不能直接使用mov ds,1000H这个指令直接将1000H这个数据送入ds这个段寄存器中,但是我们可以利用一个合法寄存器当作中转,先使用mov ax,1000H将1000H送入ax中,再使用mov ds,ax寄存器中的内容送入ds段寄存器中。
mov bx,1000H mov ds,bx mov al,[0]这三条指令实现了将10000H(1000:0)中的数据读取到a1中。
分步看一下,前两步按照上面所说的是将1000H的数据移动到ds段寄存器中,重要是第三步:首先看一下mov al,[0]这个格式al是移动目标寄存器,[0]内存单元的偏移地址,但是只有偏移地址是不能指示一个内存单元的,这时候在指令执行时,8086CPU会自动取DS中的数据为内存单元的段地址,这个段地址和[0]中括号中的偏移地址联合指向目标地址,前面两步我们将1000H送入了ds中,所有现在段地址就是1000H与偏移地址0运算之后得到10000H这个物理地址,所以我们将读取10000H这个地址的内存单元中的数据给al,就实现了整个过程
当然也可以实现将寄存器中的数据读到内存单元的操作mov bx,1000H mov ds,bx mov [0],al
同样偏移地址是0,段地址是1000H,这三个指令的意义就是将al寄存器中的数据读取到10000H内存地址的操作。