爱了爱了,这篇寄存器讲的有点意思( 六 )

但是不仅仅如此 , mov 指令还具有下面这几种表达方式
描述举例mov 寄存器 , 数据比如:mov ax,8mov 寄存器 , 寄存器比如:mov ax,bxmov 寄存器 , 内存单元比如:mov ax,[0]mov 内存单元 , 寄存器比如:mov[0], axmov 段寄存器 , 寄存器比如:mov ds,ax
栈栈我相信大部分小伙伴已经非常熟悉了 , 栈是一种具有特殊的访问方式的存储空间 。 它的特殊性就在于 , 先进入栈的元素 , 最后才出去 , 也就是我们常说的 先入后出 。
它就像一个大的收纳箱 , 你可以往里面放相同类型的东西 , 比如书 , 最先放进收纳箱的书在最下面 , 最后放进收纳箱的书在最上面 , 如果你想拿书的话 ,必须从最上面开始取 , 否则是无法取出最下面的书籍的 。
栈的数据结构就是这样 , 你把书籍压入收纳箱的操作叫做压入(push) , 你把书籍从收纳箱取出的操作叫做弹出(pop) , 它的模型图大概是这样
爱了爱了,这篇寄存器讲的有点意思文章插图
入栈相当于是增加操作 , 出栈相当于是删除操作 , 只不过叫法不一样 。 栈和内存不同 , 它不需要指定元素的地址 。 它的大概使用如下
// 压入数据Push(123);Push(456);Push(789);// 弹出数据j = Pop();k = Pop();l = Pop();在栈中 , LIFO 方式表示栈的数组中所保存的最后面的数据(Last In)会被最先读取出来(First Out) 。
爱了爱了,这篇寄存器讲的有点意思文章插图
栈和 SS 寄存器下面我们就通过一段汇编代码来描述一下栈的压入弹出的过程
8086 CPU 提供入栈和出栈指令 , 最基本的两个是 PUSH(入栈) 和 POP(出栈) 。 比如 push ax 会把 ax 寄存器中的数据压入栈中 , pop ax 表示从栈顶取出数据送入 ax 寄存器中 。
?
这里注意一点:8086 CPU 中的入栈和出栈都是以字为单位进行的 。
?
我这里首先有一个初始的栈 , 没有任何指令和数据 。
爱了爱了,这篇寄存器讲的有点意思文章插图
然后我们向栈中 push 数据后 , 栈中数据如下
爱了爱了,这篇寄存器讲的有点意思文章插图
涉及的指令有
mov ax,2345Hpush ax?
注意 , 数据会用两个单元存放 , 高地址单元存放高 8 位地址 , 低地址单元存放低 8 位 。
?
再向栈中 push 数据
爱了爱了,这篇寄存器讲的有点意思文章插图
其中涉及的指令有
mov bx,0132Hpush bx现在栈中有两条数据 , 现在我们执行出栈操作
爱了爱了,这篇寄存器讲的有点意思文章插图
其中涉及的指令有
pop ax/* ax = 0132H */再继续取出数据
爱了爱了,这篇寄存器讲的有点意思文章插图
涉及的指令有
pop bx/* bx = */完整的 push 和 pop 过程如下
爱了爱了,这篇寄存器讲的有点意思文章插图
现在 cxuan 问你一个问题 , 我们上面描述的是 10000H ~ 1000FH 这段空间来作为 push 和 pop 指令的存取单元 。 但是 , 你怎么知道这个栈单元就是 10000H ~ 1000FH 呢?也就是说 , 你如何选择指定的栈单元进行存取?
事实上 , 8086 CPU 有一组关于栈的寄存器 SS 和 SP 。 SS 是段寄存器 , 它存储的是栈的基础位置 , 也就是栈顶的位置 , 而 SP 是栈指针 , 它存储的是偏移地址 。 在任意时刻 , SS:SP 都指向栈顶元素 。 push 和 pop 指令执行时 , CPU 从 SS 和 SP 中得到栈顶的地址 。