35.栈:先进后出,涉及到入栈(PUSH)和出栈(POP)两个概念.
a)push ax //表示将ax中的数据送入栈中
b)pop ax //表示从栈顶取出数据送入ax
36.8086CPU的入栈和出栈操作都是以字为单位进行的.那么如何知道哪一段被当作栈在使用..?----How...?
PUSH和POP时,需要知道栈顶元素..?----How...?
和CS:IP类似,在8086CPU中,有两个寄存器SS和寄存器SP,栈顶的段地址存放在ss中,偏移地址在sp中.
37.任意时刻,ss:sp指向栈顶元素 .PUSH和POP时,CPU从SS和SP中得到栈顶地址.
38.栈顶超界:和C语言中指针越界一样,是很危险的操作,这个需要程序员自己控制.
39.PUSH和POP指令:PUSH和POP可以是如下格式的:
a)PUSH 寄存器
b)POP 寄存器 //将寄存器中的数据入栈或者将栈顶元素送到寄存器中
c)PUSH 段寄存器
d)POP 段寄存器 //同上
e)PUSH 内存单元
f)POP 内存单元 //同上
40.执行指令时,CPU要知道内存单元的地址,可以在PUSH,POP指令中只给出内存单元的偏移地址,段地址在执行指令时,从SS处获得.
设置栈的大小:
mov ax,1000H
mov ss,ax
mov sp,0010H //ss和sp的差值就是栈的大小了,由程序员自己控制
41.PUSH和POP与mov的区别是:两次操作和一个操作的关系.
42.栈段:被定义当作栈的一段连续的地址空间.----Where...?设置SS和SP的值.
43.关于段的结论:可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段的内存单元.-->自己设置.
用一个段存放数据,称为数据段;
用一个段存放代码,称为代码段;
用一个段存放栈,称为栈段.
对于数据段,段的地址存放在DS中,用mov,add,sub等访问内存单元的指令时,CPU就是将我们定义的数据段中的内容当数据来访问;
对于代码段,段的地址存放在CS中,将第一条指令的偏移地址放在IP中,CPU就会执行我们定义的代码段中的指令;
对于栈段,段的地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在进行栈操作时,就将我们定义的栈段当栈空间来使用.
44.因此,一段内存是什么区域,扮演什么角色,关键在于CPU中寄存器的设置,即CS,IP,SS,SP,DS的指向.