此篇文章是对应8086系统,有出入请自查。
栈-stack 通过字义就可以感觉出来,这玩意就像客栈一样。是临时储存和交换数据
用的。
介绍内存
谈轮栈之前。咱们还得先熟悉一个东东。
它就是内存。
毋容置疑。这货就是咱们常说的内存(Ram)。
每一块内存的位置都是对应一个内存地址。
一般这个地址都是用16进制来表达的。
0x400H 这就是一个内存地址
每一个内存储存两个bit(01)
1字 = 8字节 = 16bit
内存就好比是一段路。这个路上用很多电线杆。
每个电线杆就是一个内存地址。我们要取出这个电线杆附近的数据。
就需要把地址指向这里。
现在说说地址。
一般地址都是采用方式:段地址 * 16 + 偏移地址
虽然现在的cpu已经不是16位。但是偏移地址这个还是寻址使用的手段。
咱们说说短地址为什么乘以16。
比如咱们小区。用一栋楼号牌 是200.。
这时候有个人来找这栋楼。但是他每次是能发出两个字。
要不是20 ,要不是00。咱们要告诉保安找那栋楼怎么办呢。
接下来就是见证奇迹的时刻
乘法:咱们先说20 然后 说x,然后说10。
20 x 10 = 200.
虽然这样说不够确切。但是可以更好的解释。
8086的cpu只有16根信号线。所以每次只能发送16位。超过这个就会被过滤掉多余的信号。
如果咱们取17位的数据。这个17就会丢失掉。
聪明的大神就领悟到了这个神圣的乘法。
虽然咱们的cpu已经64位了。
但是这个老传统并没有取缔。这个方式也可以更好的保护数据。不被直接查看的。
咱们再来聊一聊偏移地址:
还是那个小区。
还是那位只能发两个字的先生。他这次来要找202。
这次怎么办呢:
他需要这么做:
先说20 然后 x ,然后 10 ,然后 + ,然后02。
20 x 10 + 2 = 202
这个200就是咱们的物理地址。
咱们cpu寻找数据并不是直接修改物理地址。
他每次修改的事偏移地址。也就是大家常说的ip(这个不是互联网的那个撒)
他要找205偏移地址就是5。
这个是cpu来自动计算的。咱们了解就好。不用太刻意。
通过以上解释。得到的结论就是储存4个bit就需要两个内存地址。
接下来咱们来看栈的指令。
push 入栈 : 添加数据
pop 出栈 : 取出数据
栈的储存方式是先入后出,先存进去的最后出来。
说到取数据。咱们肯定要想到一个就是寄存器。
ss寄存器就是表达咱们的栈的
sp就是咱们的栈顶。指到哪里就在哪里开始储存数据。
既然起了个栈这么吊炸天的名字。肯定不能和其他寄存器一样。
他的储存方式就是不同。他是从高地址往低地址储存的。
寄存器介绍
普通的寄存器都是从低到高的。
咱们举个例子吧:
还是那个小区,它的名字叫做栈。
它有十栋楼房。
1,2,3 ····,9,10
有人买房子。这个销售只能从第十栋开始出售。
然后出售第九栋。
这个就是push操作。
反之。如果有人想出售房子。
就得从第一栋开始。你不能插队。先买的最后才能卖。
这个就是pop操作。
接下来来一段代码:
mov ax,1000H; 赋值给ax寄存器
mov ss,ax ;指定ss栈寄存器地址
mov ax,1006H ; 赋值给ax寄存器
mov sp,ax ;开辟一个栈。空间地址为1000 - 1006
mov ax,8888H; 赋值是ax寄存器
push ax ;赋值给栈
pop bx ;取出第一个值赋值给bx
最后说明
mov是赋值指令。
在汇编里面不可以直接给寄存器指定地址。
必须通过给段内存赋值然后执行此地址即可。
ss地址可以理解为结束地址。因为栈是从高往低储存。如果你这个地址
高于sp地址(栈顶)内存就会出现泄漏。这个比较危险。
通俗来讲:
起始地址(ss) - 结束地址(sp)
但是sp是移动的。每增加数据就会移动一次。
超过sp或低于ss都会内存泄漏。
再强调一下:栈是从高往低储存。
有哪里不足的地方希望补充下。
网友评论