栈的概念的前言
栈是一段连续的内存单元,也就是一段连续的内存地址
非常专业的名字
特殊在访问形式上 这是和mov移动指令 区别最大的地方
mov ax,1000H
mov ds,ax
mov ax,[0]
mov ax,[2]
栈的概念——实际例子角度
1、栈顶标记 标记了 箱子中最上面这本书的 在箱子中的位置
2、栈 箱子
3、入栈 将书本放到箱子中最上面的书的位置的上面
4、出栈 将箱子中最上面的位置的书拿走
5、结论 由于不断的入栈或者出栈,我们需要不断的修改栈顶标记 来确定箱子中最上面的书的 在箱子中的位置
栈的概念——内存的角度
入栈 push 将16位寄存器 或者 内存中的字型数据——》放到栈顶标记的上面 不断地修改栈顶标记
出栈 pop 将栈顶标记所标识的字型数据——》放到16位寄存器或者内存中 不断地修改栈顶标记
栈顶标记在入栈和出栈时所扮演的角色去理解这个问题
入栈时:栈顶标记决定了你放的书(数据)的存放的位置(内存地址)——》栈顶标记的上面(内存地址) 修改栈顶标记(内存地址)
出栈时:栈顶标记决定了你拿走书(数据)的位置(内存地址)——》修改栈顶标记(内存地址)
来确定箱子中最上面的书(数据)的 在箱子中的位置 (通过内存地址)
得出结论: 栈顶标记是内存地址(段地址和偏移地址来表示)
在8086CPU中 在任意时刻将段地址寄存器SS和偏移地址寄存器SP所组合出来的内存地址当作栈顶标记!
push ax 修改sp寄存器中的数值 sp=sp-2 (sp是以字为单位存储,加2减2,减2指针就向上移动了)
将ax中字型数据 存放到ss:sp所组合出来的内存地址中 入栈(将ax中的内容送人SS:SP指向的内存单元处,SS:SP此时指向新栈顶)
pop bx 将SS,SP所组合出来的内存地址中的字型数据直接存放到bx
修改栈顶标记(将sp=sp+2,加2指针向下移动) 成为新的栈顶标记 出栈(SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。)
段寄存器SS:存放栈顶的段地址
寄存器SP:存放栈顶的偏移地址
将一本一本的书看作是数据
数据从哪里来 寄存器中 内存中
数据的长度 字节型数据(X) 字型数据(√)