用DS和[address]实现字的传送

要解决的问题:CPU从内存单元中要读取数据

要求:CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;

原理:在8086PC中,内存地址由段地址和偏移地址组成(段地址:偏移地址)

解决方案:DS和[address]配合

  • 用 DS寄存器存放要访问的数据的段地址

  • 偏移地址用[…]形式直接给出

1
2
3
4
/*将10000H(1000:0)中的数据读到al中*/
mov bx,1000H
mov ds,bx //DS寄存器存放要访问数据的段地址
mov al, [0] //[0]指出访问数据的偏移地址,尽管此行代码没有出现DS,但指令集规定了出现[...]这样的写法就是要其配合DS来访问一个内存单元

[0]指出访问数据的偏移地址,尽管此行代码没有出现DS,但指令集规定了出现[…]这样的写法就是要其配合DS来访问一个内存单元

1
2
3
4
/*将al中的数据写到10000H(1000:0)中*/
mov bx,1000H
mov ds,bx
mov [0],al

将段地址送入DS的两种方式

方式1:不能如此,8086CPU不支持将数据直接送入段寄存器(硬件设计的问题)

1
mov ds,1000H

方式2:套路:数据→一般的寄存器→段寄存器

1
2
mov bx, 1000H
mov ds, bx

字的传送

8086CPU可以一次性传送一个字(16位的数据)

示例

1
2
3
4
mov bx, 1000H
mov ds, bx ;确定内存单元的段地址
mov ax, [0] ;1000:0处的字型数据送入ax,即内存数据读取到寄存器
mov [0], cx ;cx中的16位数据送到1000:0处,即寄存器数据写入到内存

image-20230903160907235

字的传送案例1

已知内存状态如下图所示,执行如下指令,写出寄存器状态

image-20230903161044023

1
2
3
4
5
6
7
mov ax, 1000H
mov ds, ax
mov ax, [0]
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]

寄存器状态

寄存器 值
AX 1000H——1123H
(注意读取的是低位开始的16位的字,不是1个字节,读取时高位在前,低位在后)
BX 6622H——6622H+2211H=8833H
CX 2211H——2211H+2211H=8833H
DX 不涉及
SP 不涉及
BP 不涉及
SI 不涉及
DI 不涉及
DS 10000H(这是合成的内存物理地址)
ES 不涉及
SS 不涉及
CS 不涉及
IP 不涉及

Debug工具验证

略,自行验证

字的传送案例2

已知内存状态如下图所示,执行如下指令,写出寄存器状态

image-20230903162216851

1
2
3
4
5
6
7
mov ax, 1000H
mov ds, ax
mov ax, 2C31
mov [0], ax
mov bx, [0]
sub bx, [2]
mov [2], bx

image-20230903162239961

站内搜索

没有找到内容!