汇编语言个人学习笔记——第三章 寄存器(内存访问)第一部分
3.1内存中字的存储
在0地址处开始存放20000(4E20H):
高位对应高地址,低位对应低地址。
注意:0号是低地址单元,1号是高地址单元。
字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。
问题:
1、0地址单元中存放的字节型数据是多少?(20H)
2、0地址字单元中存放的字型数据是多少?(4E20H)
3、2地址字单元存放的字节型数据是多少?(12H)
4、2地址单元中存放的字型数据是多少?(0012H)
5、1地址字单元中存放的字型数据是多少?(124EH)
结论:
任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可看成一个地址为N的字单元中的高位字节单元和低位字节单元。
3.2 DS和[address]
CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;
在8086PC中,内存地址由段地址和偏移地址组成。
8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。
例如:
我们要读取10000H单元的内容可以用如下程序段进行:
mov bx,10000H
mov ds,bx
mov al,[0]
上面三条指令将10000H(1000:0)中的数据读到al中。
已知的mov指令可以完成的两种传送功能:
1、将数据直接送入寄存器(如mov ax,1000H)
2、将一个寄存器中的内容送入另一个寄存器中(如mov ax,bx)
除此之外,mov指令还可以将一个内存单元中的内容送入一个寄存器。(mov al,[0]将偏移地址为0的单元的内容送入al寄存器,al寄存器有一个字节,8位)
从哪个内存单元送入哪个寄存器?
mov指令的格式:mov 寄存器名,内存单元地址
“[……]”表示一个内存单元,“[……]”中的0表示内存单元中的偏移地址。
那么内存单元中的段地址是多少?(DS中的数据)
执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。
如何用mov指令从10000H中读取数据?
1、10000H表示为:1000:0(段地址:偏移地址)
2、将段地址1000H放入ds
3、用mov al,[0]完成传送(mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元中的偏移地址是0,它的段地址默认放在ds中)
能不能直接mov ds,1000H将1000H送入ds寄存器?
答案是不能。
8086CPU不支持将数据直接送入段寄存器的操作,但是可以将数据直接送入通用寄存器,ds是一个段寄存器。(硬件设计的问题)
mov ds,1000H这条指令是非法的。
数据->通用寄存器->段寄存器
问题:写几条数据,将al中的数据送入10000H内存单元中。
分析问题的本质:
怎样将数据从寄存器送入内存单元?
结论:
mov bx,1000H
mov ds,bx
mov [0],al
3.3 字的传送
因为8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据,也就是一次性传送一个字。
比如:
前面的mov bx,1000H
mov ds,bx
确定了段地址。,后面mov ax,[0]将1000:0处的字型数据送入ax,是因为ax是16位的寄存器,默认存过去的就是16位数据,如果前面是al就会存过去8位数据。
问题:
内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值
个人分析:
mov ax,1000H(将1000H送入ax寄存器中)
mov ds,ax(将寄存器ax中的值送入ds段寄存器中)
mov ax,[0](将1000:0地址字单元中的值送入ax中,此时,ax:1123H)
mov bx,[2] (将1000:2地址字单元中的值送入bx中,此时,bx:6622H)
mov cx,[1](将1000:1地址字单元中的值送入cx中,此时,cx:2211H)
add bx,[1](将1000:1地址字单元中的值加到bx中,此时,bx:8833H)
add cx,[2](将1000:2地址字单元中的值加到cx中,此时,cx:8833H)
问题:
内存中的情况如下图,写出下面命令执行后,寄存器ax,bx中的值
个人分析:
mov ax,1000H
mov ds,ax(将1000H送入段寄存器ds中)
mov ax,11316(十进制变16进制,ax中的值:2C34H)
mov [0],ax(此时10000H中的值:34,10001H中的值:2C)
mov bx,[0](将1000:0地址字单元中的值送入bx中,bx:2C34H)
sub bx,[2](将bx中的值减去1000:2地址字单元中的值,bx:1B12H)
mov [2],bx(将bx中的值送入1000:2地址字单元)
注:可以使用debug进行检查验证,sub命令在下面有解释。
3.4 mov、add、sub指令
已学mov指令的几种形式:
mov 寄存器,数据 比如:mov ax,8
mov 寄存器,寄存器 比如:mov ax,bx
mov 寄存器,内存单元 比如:mov ax,[0]
mov 内存单元,寄存器 比如:mov [0],ax
mov 段寄存器,寄存器 比如:mov ds,ax