1)字单元
前面说过,寄存器一般存放的是一个字(16位),而内存单元存放的是字节,所以当寄存器从内存地址空间中存取字的时候,需要从连续两个内存单元中存取,于是提出了“字单元”的概念:存放一个字的存储单位,由地址连续的两个内存单元组成,高地址内存单元存放高字节,低地址单元存放低字节。字单元的地址就是低地址内存单元的地址,例如地址为N和N+1的单元组成的字单元的地址是N,N+1和N+2单元组成的字单元的地址则是N+1。
2)访问内存单元
CPU要访问一个内存单元,则必须要先给出这个内存单元的地址,DS段寄存器通常用来存放要访问数据的内存单元段地址,比如要访问10000H单元的内容:
mov bx,1000H
mov ds,bx
mov al,[0]
上面的指令将1000H:0中的数据读到al中。
DS:[address]得到CPU访问的内存单元的物理地址。
[address]表示一个内存单元,address表示内存单元的偏移地址,而段地址直接取ds寄存器中的内容。
上面的指令用到了mov指令的三种用法:1、将数据传送到寄存器;2、将寄存器中内容传递到另一个寄存器;3、将内存单元中的数据传递到寄存器。但也说明了另外一个问题:不能将立即数直接传送到段寄存器!而是先将其存入一个通用寄存器,再将通用寄存器中的内容传送到段寄存器中。
3)字的传送
上面的例子传送的是一个字节到寄存器的低地址部分,其实8086CPU是16位结构,也可以一次传送一个字的数据。
mov bx,1000H
mov ds,bx
mov ax,[0] //从内存中取数据
mov [0],ax //将一个字传送到字单元
4)指令
mov是最常用的两操作数指令,有以下几种行式
- mov 寄存器,数据 //注意不能直接将数据传送到段寄存器中
- mov 寄存器,寄存器
- mov 寄存器,内存单元
- mov 内存单元,寄存器
- mov 段寄存器,内存单元
- mov 内存单元,段寄存器
- mov 段寄存器,寄存器
- mov 寄存器,段寄存器
add和sub与mov的操作几乎一样
5)数据段
对于8086CPU(16位),可以将一组内存单元定义为一个段,长度N<64KB,地址连续,起始地址为16的倍数的内存单元用做专门存放数据的段,从而定义了数据段,比如用123B0H至123B9H这段内存空间来存放数据,则知道改数据段的短地址是123BH,长度为10字节。
数据段是编程时的一种安排,将段地址写入DS中后,即可对数据段中的数据进行操作。
mov ax,123BH
mov ds,ax
mov ax,0
add al,[0]
add al,[1]
add al,[2]
将数据段的前三个内存单元数据叠加。
【参考】
https://www.jianshu.com/p/0cfcf7cddbb5
《汇编语言》-王爽