汇编语言学习(四):寄存器(栈之前)
第三章:寄存器(部分加实验)
3.1字的存储方式
如图所示,最左端的数字是IP的缩写,应该为0000,0001H等,每一个小格都是一个内存单元,存储两个16进制数,也就相当于一个字节,相当于8bit.
CPU中用16位寄存器存储一个字,也就是两个八位,就是两个小格的意思。前两个小格是4E20H,就可以看作一个起始为0的字单元。低位存在0号单元,高位存在1号单元。,后面也是如此。
字的定义:字单元,即存放一个字型数据(16位的内存单元),由两个地址连续的内存单元组成。高地址位存放高位字节,低地址内存存放低位字节。
3.2 DS寄存器和[address]
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位寄存器即可
我们来解释一下:
首先还是确定DS寄存器中存放的地址,然后将10000H里的字型数据赋值到AX中,然后将CX中的数据放到10000地址中,也就是改变DS首地址10000H里的数据。
下面我们来练习一个稍微复杂的
1 | mov ax,1000H |
这是初始内存状态。现在我们作解释:
1 | 首先确定DS指向的地址:10000H |
下面实验从段寄存器向寄存器中传值,从寄存器向内存单元,等传送数据方式是否有效
我们使用A命令:
之前先注意一下DS指向的地址是073F:0100H
成功写入,也看到一次写入一个字型数据,使IP向后移动两位。
可以看到我们把DS中存放的段地址送进了AX中。
我们下面尝试将段寄存器中的地址放到内存单元中:
1 | mov ax,1000H |
cs,ds都是段寄存器。
先让CS:IP指向10000H地址。然后开始赋值。改变CS:IP是因为CS:IP决定了执行指令的地址!不指向CS:IP就无法执行我们在那个CS:IP地址放的指令!
其实可以直接用A命令在我们想要的地址处写入。然后再用D命令在我们想要的地址处查看。
三次命令执行之后
确实可以看到1000:0000H地址处的数据变成了CS里面的数据1000,且根据高低位00在前,10在后。
最后我们来看将内存单元的值赋给段寄存器。
即改变段寄存器的指向的地址!
如下命令:
1 | mov ax,1000h |
先修改CS:IP,然后输入指令,然后执行!
修改好了CS:IP,之后写入命令。
完成了两次命令的执行,还差最后一个 mov ds,[0000]
这次对照看,执行之后确实将00B8移到了DS里面,也就是可以将内存的值赋给DS当作地址!
下面试一下是否能执行
1 | add ds,ax |
我们发现不能执行会报错,所以段寄存器和寄存器中的值不能相加减!
3.5数据段
即对应了段地址,也就是将一组内存单元定义为一个段。,用DS存放段地址比如定义123B0-123B9为数据段
这里没什么新鲜知识,做一个练习:
写入之后将AL变为0,也就是AX的低位,就是说AX = 1200,而后面加的是123B:0001的字和123B:0002的字,他们的地址处数据都为0,所以相当于都加0,故AX一直为1200没有改变!
下次把栈全写完!