俗话说的好,温故而知新!
内存中字的存储
8086CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放。比如我们从0地址开始存放20000,图示:
上图中,我们用0、1两个内存单元存放数据20000(4E20H),0、1两个连续的内存单元用来存储一个字,这两个连续的内存单元可以看作一个起始地址为0的字单元。
问题:
- 1地址字单元中存放的字型数据是多少?
- 2地址字单元中存放的字型数据是多少?
- 2地址单元中存放的字节型数据是多少?
- 0地址字单元中存放的字型数据是多少?
- 0地址单元中存放的字节型数据是多少?
分析:
- 1地址字单元中存放的字型数据是:124EH
- 2地址字单元中存放的字型数据是:0012H
- 2地址单元中存放的字节型数据是:12H
- 0地址字单元中存放的字型数据是:4E20H
- 0地址单元中存放的字节型数据是:20H
DS和[address]
8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址,比如我们要读取10000H单元的内容,可以用如下程序段进行:
mov bx,1000H
mov ds,bx
mov al,[0] ; “[...]”表示一个内存单元,“[...]”中的0表示内存单元的偏移地址。
; 指令执行时,8086CPU自动取ds中的数据为内存单元的段地址
其中 mov al,[0] 代表:将一个内存单元(字节单元)送入al,完成数据从1000:0单元到al的传送。这条指令执行时,ds中的内容应为段地址1000H,所以在这条指令之前应该将1000H送入ds寄存器。
问题:
如何将al中的数据送入内存单元10000H中?
分析:
mov bx,1000H
mov ds,bx
mov [0],al ; 将al中的数据送入内存单元10000H中
字的传送
前面我们用mov指令在寄存器和内存之间进行字节型数据的传送。因为8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据,也就是一次性传送一个字(两个字节或16比特),如下:
mov bx,1000H
mov ds,bx
mov ax,[0] ; 1000:0处的字型数据送入ax
mov [0],cx ; cx中16位数据送到1000:0处
问题:
内存中的情况如下,写出下面的指令执行后寄存器ax,bx,cx中的值?
mov ax,1000H
mov ds,ax
mov ax,[0]
mov bx,[2]
mov cx,[1]
mov bx,[1]
mov cx,[2]
分析:
指令执行后,ax=1123H,bx=2211H,cx=6622H
mov ax,1000H
mov ds,ax
mov ax,[0] ; 将1000:0处字单元的内容送入ax,此时ax=1123H
mov bx,[2] ; 将1000:2处字单元的内容送入bx,此时bx=6622H
mov cx,[1] ; 将1000:1处字单元的内容送入cx,此时cx=2211H
mov bx,[1] ; 将1000:1处字单元的内容送入bx,此时bx=2211H
mov cx,[2] ; 将1000:2处字单元的内容送入cx,此时cx=6622H
操作符X ptr
在没有寄存器名存在的情况下, 用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte,如下:
;下面的指令中,用word ptr指明了指令访问的内存单元是一个字单元
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
;下面的指令中,用byte ptr指明了指令访问内存单元是一个字节单元
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
但有些指令默认了访问的是字单元还是字节单元,比如:push [1000H] 就不用指明,因为push指令只进行字(两个字节)操作。