汇编语言数据段寄存器DS和[address]

mov bx,1000H
mov ds,bx
mov a1,[0]

上面的3条指令将10000H(1000:0)中的数据读到al中。
下面详细说明指令的含义。

mov a1,[0]

前面我们使用mov指令,可完成两种传送:
①将数据直接送入寄存器;
②将一个寄存器中的内容送入另一个寄存器。
也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。
从哪一个内存单元送到哪一个寄存器中呢?在指令中必须指明。寄存器用寄存器名来指明,内存单元则需用内存单元的地址来指明。显然,此时mov指令的格式应该是;mov寄存器名,内存单元地址。

“[…]”表示一个内存单元,“[…]”中的0表示内存单元的偏移地址。

我们知道,只有偏移地址是不能定位一个内存单元的,那么内存单元的段地址是多少呢?指令执行时,8086CPU自动取ds中的数据为内存单元的段地址。

再来看一下,如何用mov指令从10000H中读取数据。10000H用段地址和偏移地址表示为1000:0,我们先将段地址1000H放入ds,然后用mov al,[0]完成传送。mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中,指令执行时,8086CPU会自动从ds中取出。

mov bx,1000H
mov ds,bx

若要用mov al,[0]完成数据从1000:0单元到al的传送,这条指令执行时,ds中的内容应为段地址1000H,所以在这条指令之前应该将1000H送入ds
如何把一个数据送入寄存器呢?我们以前用类似“mov ax, l”这样的指令来完成,从理论上讲,我们可以用相似的方式:mov ds, l000H,来将1000H送入ds。可是,现实并非如此,8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器,所以mov ds, l000H这条指令是非法的。那么如何将1000H送入ds呢?只好用一个寄存器来进行中转,即先将1 OOOH送入一个一般的寄存器,如bx,再将bx中的内容送入ds
为什么8086CPU不支持将数据直接送入段寄存器的操作?这属于8086CPU硬件设计的问题,我们只要知道这一点就行了。

问题3.2

写几条指令,将al中的数据送入内存单元0000H中,思考后看分析。
分析
怎样将数据从寄存器送入内存单元?从内存单元到寄存器的格式是:"mov寄存器名,内存单元地址”,从寄存器到内存单元则是:"mov内存单元地址,寄存器名”。
1 0000H可表示为1000:0,用ds存放段地址1 000H,偏移地址是。,则mov [0],al可完成从al到10000H的数据传送。完整的几条指令是:

mov bx,1000H
mov ds,bx
mov [0], a1

段寄存器扩展汇总

1. 在8086CPU中,使用16位寄存器来存储一个字(word). 高8位存放高位字节,低8位存放低位字节。

在内存中存储时,由于内存单元是字节单元,则一个字(word)需要用2个地址连续的内存单元来存放 。
这个字(word)的低位字节存放在低地址单元中,高位字节存放在高地址单元中。

2. 我们将起始地址为N的字单元简称为N地址字单元 。

如:一个字单元由2、3两个内存单元组成,则这个字单元的起始地址为2,我们可以说这是:2地址字单元 。

3. 字节单元与字单元。

一个内存单元可以存储1个字节数据(byte), 相当于 8位(bit)数据。称为"字节单元"。
一个字单元,大家知道,一个字(word)等于2个字节(byte), 所以
一个字单元,需要2个地址连续的字节单元存放。
字的低字节位放在低地址字节单元中,字的高字节位放在高地址字节单元中。

4. CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。

8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。
如:我们要读取10000H单元的内容。

则:

    mov bx, 1000H
    mov ds, bx
    mov al, [0]

mov 指令也可以将一个内存单元中的内容送入一个寄存器中。[...]表示一个内存单元。[...]中的0表示内存单元的偏移地址。
指令执行时,8086CPU自动取DS寄存器中的数据为内存单元的段地址。

5. 8086CPU不支持将数据直接送入段寄存器的操作 ,DS是一个段寄存器,所以 mov ds, 1000H是非法的指令 。

可以用一个寄存器来中转,如:

    mov bx, 1000H
    mov ds, bx

6. 字的传送

因为8086CPU是16位结构,有16根数据线,所以一次性可以传送16位的数据,也就是说,一次性可以传送一个字(word).
只要mov指令中给出16位寄存器就可以进行16位数据的传送了。如:

    mov bx, 1000H
    mov ds, bx
    mov ax, [0]       ; 1000:0 处的字形数据送入AX寄存器中
    mov [0], cx       ; cx寄存器中的16位数据送到1000:0处

6. 例子

内存情况, 如下所示,写出下面指令执行后寄存器AX、BX、CX中的值。

    10000H    23H
    10001H    11H
    10002H    22H
    10003h    66H
mov ax, 1000H  
mov ds, ax  
mov ax, [0]  
mov bx, [2]  
mov cx, [1]  
add bx, [1]  
add cx, [2]  

解析:

    mov ax, 1000H
    mov ds, ax

上面2条指令,将DS寄存器设置为 1000H (代码段地址)

mov ax, [0] 由于AX是16位寄存器,所以需要把字型数据送入AX

1000:0内存单元中存储着字型数据的低8位,23H
1000:1内存单元中存储着字形数据的高8位,11H
指令执行时,字型数据的高8位送入AH,字形数据的低8位送入AL,则AX寄存器的值为1123H。

后面的原理相同。


发布日期:

所属分类: 易语言 标签: