栈及栈操作的实现

栈结构

  • 栈是一种只能在一端进行插入或删除操作的数据结构。

  • 栈有两个基本的操作︰入栈和出栈。

    • 入栈:将一个新的元素放到栈顶;
    • 出栈:从栈顶取出一个元素。
  • 栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。

  • 栈的操作规则:LIFO ( Last In First Out,后进先出)

  • CPU提供的栈机制

    • 现今的CPU中都有栈的设计。
    • 8086CPU提供相关的指令,支持用栈的方式访问内存空间。
    • 基于8086CPu的编程,可以将一段内存当作栈来使用。
  • PUSH(入栈)和POP(出栈)指令

    • push ax 将ax中的数据送入栈中
    • pop ax 从栈]页取出数据送入ax
    • (以字为单位对栈进行操作)
  • 问题:

    1. CPU如何知道一段内存空间被当作栈使用?

      8086CPU中,有两个与栈相关的寄存器

      栈段寄存器SS -存放栈顶的服地址
      栈顶指针麦材器SP -存放栈顶的偏移地址

    2. 执行push和pop的时候,如何知道哪个单元是栈顶单元?

      任意时刻SS:SP指向栈顶元素。

栈的操作

mov ax,1000H
mov ss, ax
mov sp, 0010H
mov ax, 001AH
mov bx,001BH
push ax
push bx
pop ax
pop bx

在这里插入图片描述

push指令和pop指令的执行过程

  • push ax
    1. SP=SP-2;
    2. 将ax中的内容送入SS:SP指向的内存单
      元处,SS:SP此时指向新栈顶。
  • pop ax
    1. 将SS:SP指向的内存单元处的数据送
      入ax中;
    2. SP = SP+2,SS:SP指向当前栈顶下面的
      单元,以当前栈顶下面的单元为新的栈顶。
  • 栈顶超界问题
    • 如何能够保证在入栈、出栈时,栈顶不
      会超出栈空间?

栈顶超界问题的解决

  • 8086CPU不保证对栈的操作不会超界。8086CPU 只知道栈顶在何处(由SS:SP指示),不知道程序安排的栈空间有多大。
  • 我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;防止出栈时栈空了仍然继续出栈而导致的超界。

栈的小结

  • push、pop 实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。
  • 执行push和pop指令时,SP中的内容自动改变。
  • 8086CPU提供的栈操作机制∶
    • 在SS,SP中存放栈顶的段地址和偏移地址,入栈和出栈指令根据SS:SP指示的地址,按照栈的方式访问内存单元。
    • push指令的执行步骤∶
      1. SP=SP-2;
      2. 向SS:SP指向的字单元中送入数据。
    • pop指令的执行步骤︰
      1. 从SS:SP指向的字单元中读取数据
      2. SP=SP+2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值