美文网首页
(三)我学汇编的那几年-栈篇

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

作者: py晓枫 | 来源:发表于2019-07-14 18:07 被阅读0次
    此篇文章是对应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都会内存泄漏。
    再强调一下:栈是从高往低储存。
    有哪里不足的地方希望补充下。

    相关文章

      网友评论

          本文标题:(三)我学汇编的那几年-栈篇

          本文链接:https://www.haomeiwen.com/subject/oyqikctx.html