3.4 mov, add, sub指令
mov 寄存器,数据 —> mov ax, 8
mov 寄存器,寄存器 —> mov ax, bx
mov 寄存器,内存单元 —> mov ax, [0]
mov 内存单元,寄存器 —> mov [0], ax
mov 段寄存器,寄存器 —> mov ds, ax
mov 寄存器,段寄存器 —> mov ax, ds
mov 内存单元,段寄存器—> mov [0], cs
mov 段寄存器,内存单元—> mov ds, [0]
3.5 数据段
对于8086PC, 可以将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存你单元当做专门存储数据的内存空间,从而定义一个数据段。例如,用123B0H~123B9H这段内存空间来存放数据,我们就可以认为,123B0H~123B9H这段内存是一个数据段,它的地址为123BH,长度为10个字节。
解释:
- 长度最大值为64KB,因为最大寻址能力为$2^16-10$ = 64KB。
- 123B0H, 段地址为123B,偏移地址为0~9所以为10个字节。
如何访问数据段中的数据呢?将一段内存你当做数据段,是我们再编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
比如,将123B0H~123B9H的内存单元定义为数据段。现在要累加这个数据段中的前三个单元数据:
mov ax, 123BH
mov ds, ax
mov al, 0 #这行以及下行可以合并为mov al, [0]
add al, [0]
add al, [1]
add al, [2]
值得注意的是,如果要求累加3个字型数据,代码会发生改变:
mov ax, 123BH
mov ds, ax
mov ax, 0
add ax, [0]
add ax, [2]
add ax, [4]
注意这里,一个字型占用两个单元,所以偏移地址是0, 2, 4。