内存中字的存储:
两个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的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
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实质上就是一 种内存传送指令,可以在寄存器和内存之间传送数据,
与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指令等,就将我们定义的栈段当作栈空间来用。