(三)我学汇编的那几年-栈篇

2019-07-14  本文已影响0人  py晓枫
此篇文章是对应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都会内存泄漏。
再强调一下:栈是从高往低储存。
有哪里不足的地方希望补充下。

上一篇下一篇

猜你喜欢

热点阅读