当前位置: 首页 > article >正文

汇编:关于栈的知识

 1.入栈和出栈指令

 2. SS与SP

 3. 入栈与出栈

       3.1 执行push ax ↑↑

       3.2 执行pop ax  ↓↓

       3.3 栈顶超界的问题

 4. 寄存器赋值         


        基于8086CPU编程时,可以将一段内存当作栈来使用。一个栈段最大可以设为64KB(0-FFFFH)。

    1.入栈和出栈指令

  •     push(入栈)
  •     pop (出栈)

        — push ax:将寄存器ax中的数据送入栈中
        — pop ax:从栈顶取出数据送入ax
        — 入栈和出栈操作都是以【(16位)】为单位进行
        — pop和push可以在寄存器和内存之间传送数据


    2. SS与SP

          8086CPU中,有两个寄存器

  •     SS:段寄存器,存放栈顶段地址
  •     SP:寄存器,存放栈顶偏移地址【专用寄存器】

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

        若栈为空,sp指向最高地址单元的下一个单元。


    3. 入栈与出栈

          栈顶是低地址单元, 栈底是高地址单元。


        3.1 执行push ax ↑↑
  •     sp=sp-2(偏移地址减少,即往低地址处偏移[栈顶方向])
  •     将ax中的内容送入到ss:sp指向的内存单元
  •     ss:sp此时指向新栈顶
       3.2 执行pop ax  ↓↓
  •      将ss:sp指向的内存单元的内容送入到ax中(取出的内容在内存中仍存在,并没有被重置,下一轮push会覆盖)
  •      sp=sp+2(偏移地址增加,即往高地址处偏移[栈底方向]) 
       3.3 栈顶超界的问题

           8086CPU没有记录栈顶上下限的寄存器,不保证栈的操作不会越界。栈空时pop出栈或当栈满时push入栈都会发生栈顶超界问题,操作到栈以外的数据。


 4. 寄存器赋值         

        关于cs、ip、ss、sp、ds的赋值:

  •  可以通过mov直接给sp赋值【立即数寻址】
  •  不能通过mov给cs、ip、ss、ds赋值
  •   给cs和ip赋值需要使用jum指令
  •   给ss和ds赋值需要使用mov ss/ds, 寄存器;【寄存器寻址】

http://www.kler.cn/a/146924.html

相关文章:

  • spi 回环
  • DQN系列算法详解
  • 性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告
  • SpringSecurity+jwt+captcha登录认证授权总结
  • 【C语言】科技要闻。
  • ES6笔记
  • mybatis配置文件中配置类型别名的方式
  • 鸿蒙应用开发-初见:ArkUI
  • uni-app+vue3 封装全局函数(详细完整的方法)
  • 笔记62:注意力汇聚 --- Nadaraya_Watson 核回归
  • threejs下监听mesh事件与监听3D对象的区别
  • 28. Spring源码篇依赖注入之Optional
  • 【LeetCode】挑战100天 Day14(热题+面试经典150题)
  • Using Application Engine Meta-SQL 使用应用引擎元SQL
  • Java制作“简易王者荣耀”小游戏
  • MySQL日期函数sysdate()与now()的区别,获取当前时间,日期相关函数
  • 再探Docker:从Docker基础到跨服务器部署
  • 京东平台双11全品类完整销售数据回顾(京东大数据-京东数据采集-京东数据接口)
  • 什么是机器学习
  • 概念理论类: Linux的管道机制
  • 生成EtherCAT从站XML图片信息方法
  • VR全景技术助力政务服务大厅数字化,打造全新政务服务体验
  • Python字典合并
  • Java远程连接本地开源分布式搜索引擎ElasticSearch
  • 部署kafka
  • ZKP11.4 Use CI to instantiate Fiat-Shamir