汇编语言学习-寄存器(内存访问)

内存中字的存储:

两个16进制位是一个字节!

0号单元是低地址单元,1号单元是高地址单元。

0地址单元中存放的字节型数据是多少?

注意区别:“0地址单元”指向的就是:20H

0地址字单元中存放的字型数据是多少?

注意区别:“0地址单元”指向的就是:4E20H

结论:

任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,

也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

DS和address:

CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;

在8086PC中,内存地址由段地址和偏移地址组成;

8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。

mov指令可以完成的两种传送功能:

1,将数据直接送入寄存器

2,将一个寄存器中的内容送入另一个寄存器中

8086不支持直接将数据送入段寄存器(DS),但是可以送入通用寄存器(AX)!

正确的操作:数据-》通用寄存器-》段寄存器

mov al,[0]:是将偏移地址为0的单元内容送入寄存器中。

 

字的传送:

因为8086CPU是16位结构,有16根数据线,所以就可以一次性传送16位数据,也就是一次性传送一个字。

  哔哩哔哩小甲鱼 汇编语言 记录一下 寄存器(内存访问)两个小实验

mov,add,sub指令

数据段:

我们可以将一组长度为N(N《=64K》),地址连续,起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。

小甲鱼-累加数据段中的前3个字型数据【不对的话,请指教!】

mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

汇编语言 第3版 王爽 检测点习题部分—答案及详细解析 检测点3.1

栈:

push:(入栈)   pop:(出栈)
push ax:将寄存器ax中的数据送入栈中;pop ax:从栈顶取出数据送入ax。

8086CPU的入栈和出栈操作都是以字为单位进行的。

王爽老师的两个疑惑:

1,CPU如何知道一段内存空间被当作栈使用?

2,执行push和pop的时候,如何知道哪个单元是栈顶单元?

8086CPU中,有两个寄存器:

         段寄存器SS  存放栈顶的段地址

         寄存器SP      存放栈顶的偏移地址

回答疑惑:

1,任意时刻,SS:SP指向栈顶元素。遇到SS:SP就知道这个是栈啦。

2,任意时刻,SS:SP指向栈顶元素。

pop和push是逆运算!

栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2,SP原来为000EH,加2后SP=10H

所以栈为空的时候,SS=1000H,SP=10H。

任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈项元素

所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。

栈最底部字单元的地址为1000:000E,所以栈空时SP=0010H。

栈顶越界的问题:

我们在编程的时候要自己操心栈项超界的问题,要根据可l能用到的最大栈空间,来安排栈的大小,

防止入栈的数据太多而导致的超界;
执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。
栈空间当然是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。

push段寄存器:将一个段寄存器中的数据入栈

pop段寄存器:出栈,用一个段寄存器接收出栈的数据

栈操作都是以字为单位!

小甲鱼关于push,pop指令的一个编程题

push、pop实质上就是一 种内存传送指令,可以在寄存器和内存之间传送数据,

与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,

而是由SS:SP指出的。

同时,push和pop指令还要改变SP中的内容。
push:先放入数据,再sp=sp-2;

pop:先拿出数据,再sp=sp+2;

汇编语言 执行push和执行pop区别

push,pop实质上是一种内存传送指令。

栈段:

一个栈段最大能设置多大?

16个二进制位。2的16次方,64KB!

栈顶的变化范围是0-ffffh,从栈空的时候SP=0,一直压栈,直到栈满时SP=0;

如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。

栈是用来临时存放东西的。

一个段存放数据,将它定义为“数据段”;一个段用来存放代码,将它定义为“代码段”;一个段当作栈,将它定义为“栈段”;

1,对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,

CPU就将我们定义的数据段中的内容当作数据段来访问;

2,对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,

这样CPU就将执行我们定义的代码段中的指令;

3,对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地置放在SP中,这样CPU在需要进行栈操作的时候,

比如执行push、pop指令等,就将我们定义的栈段当作栈空间来用。

汇编语言 第3版 王爽 检测点习题部分—答案及详细解析 检测点3.2

猜你喜欢

转载自blog.csdn.net/weixin_42859280/article/details/106931821