汇编语言个人学习笔记——第三章 寄存器(内存访问)第一部分

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