第三章:寄存器(部分加实验)

3.1字的存储方式

image-20220302225030844

如图所示,最左端的数字是IP的缩写,应该为0000,0001H等,每一个小格都是一个内存单元,存储两个16进制数,也就相当于一个字节,相当于8bit.

CPU中用16位寄存器存储一个字,也就是两个八位,就是两个小格的意思。前两个小格是4E20H,就可以看作一个起始为0的字单元。低位存在0号单元,高位存在1号单元。,后面也是如此。

字的定义:字单元,即存放一个字型数据(16位的内存单元),由两个地址连续的内存单元组成。高地址位存放高位字节,低地址内存存放低位字节。

3.2 DS寄存器和[address]

image-20220302225521856

DS表示一个寄存器,专门用来存放要访问的数据的段地址。比如要读取10000H地址的内容,首先由CS:IP分解,可以知道可以简单分解成:1000:0

我们将1000H赋值给BX,将BX赋值给DS就完成了对段地址的传输。DS一般表示成数组形式,第三行的[0]就表示要访问的IP。也就是0

合起来就是10000H,为什么不直接把1000H传给DS呢?

1
8086CPU中,DS寄存器不能直接接收数据!

8086是16位的CPU可一次性完成16位传送,所以我们在mov指令中只要给出16位寄存器即可

image-20220302225958641

我们来解释一下:

首先还是确定DS寄存器中存放的地址,然后将10000H里的字型数据赋值到AX中,然后将CX中的数据放到10000地址中,也就是改变DS首地址10000H里的数据。

下面我们来练习一个稍微复杂的

1
2
3
4
5
6
7
mov ax,1000H
mov ds,ax
mov ax,11316
mov [0],ax
mov bx,[0]
sub bx,[2]
mov [2],bx

image-20220302231020292

这是初始内存状态。现在我们作解释:

1
2
3
4
5
6
7
8
9
首先确定DS指向的地址:10000H
将11316化为16进制2C34H放入AX中
将AX中的2C34H放入10000H地址中,作为字型数据,应该占两个格也就是将23换成34,将11换成2C
然后将[0]中的数据也就是2C34H赋值给BX
然后再从BX中减去[2]的字型数据也就是1122H
减完应该得1B12H赋值给BX
然后将BX中的数据赋值给[2]
也就是修改[2]中的数据为10002H:12 10003H:1B

下面实验从段寄存器向寄存器中传值,从寄存器向内存单元,等传送数据方式是否有效

我们使用A命令:

image-20220302235136745

之前先注意一下DS指向的地址是073F:0100H

image-20220302235254863

成功写入,也看到一次写入一个字型数据,使IP向后移动两位。

image-20220302235350655

可以看到我们把DS中存放的段地址送进了AX中。

我们下面尝试将段寄存器中的地址放到内存单元中:

1
2
3
mov ax,1000H
mov ds,ax
mov [0],cs

cs,ds都是段寄存器。

image-20220303000156441

先让CS:IP指向10000H地址。然后开始赋值。改变CS:IP是因为CS:IP决定了执行指令的地址!不指向CS:IP就无法执行我们在那个CS:IP地址放的指令!

image-20220303000316145

其实可以直接用A命令在我们想要的地址处写入。然后再用D命令在我们想要的地址处查看。

image-20220303000536987

三次命令执行之后

确实可以看到1000:0000H地址处的数据变成了CS里面的数据1000,且根据高低位00在前,10在后。

最后我们来看将内存单元的值赋给段寄存器。

即改变段寄存器的指向的地址!

如下命令:

1
2
3
mov ax,1000h
mov ds,ax
mov ds,[0]

先修改CS:IP,然后输入指令,然后执行!

image-20220303002858506

修改好了CS:IP,之后写入命令。

image-20220303003008205

完成了两次命令的执行,还差最后一个 mov ds,[0000]

image-20220303003117131

这次对照看,执行之后确实将00B8移到了DS里面,也就是可以将内存的值赋给DS当作地址!

下面试一下是否能执行

1
add ds,ax

image-20220303003448908

我们发现不能执行会报错,所以段寄存器和寄存器中的值不能相加减!

3.5数据段

即对应了段地址,也就是将一组内存单元定义为一个段。,用DS存放段地址比如定义123B0-123B9为数据段

这里没什么新鲜知识,做一个练习:

image-20220303003840517

image-20220303004241813

写入之后将AL变为0,也就是AX的低位,就是说AX = 1200,而后面加的是123B:0001的字和123B:0002的字,他们的地址处数据都为0,所以相当于都加0,故AX一直为1200没有改变!

下次把栈全写完!