聊了那么多,是时候简短的总结一下栈和段。

栈的综述

8086CPU提供了栈操作机制,方案如下。

1、在SSSP中存放栈顶的段地址和偏移地址;

2、8086提供入栈和出栈指令,它们根据SS:SP指示的地址,按照栈的方式访问内存单元。

3、push指令的执行步骤:①SP=SP-2②向SS:SP指向的字单元中送入数据。

4、pop指令的执行步骤:①从SS:SP指向的字单元中读取数据;②SP=SP+2

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

6、8086CPU只记录栈顶,栈空间的大小我们要自己管理。

7、用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。

8、pushpop实质上是一种内存传送指令,注意它们的灵活应用。

对于段,很多同学不太理解段这个概念,对于8086PC机,在编程时,可以根据需要,将一组内存单元 定义为一个段。我们可以将长度为N(NW64KB)的一组地址连续、起始地址为16的倍数 的内存单元,当作栈空间来用,从而定义了一个栈段。

这里给出一个在栈为空的情况下快速得出 SP 的方法(知道 SS),如:

如果将10000H〜1FFFFH这段空间当作栈段,初始状态栈是空的,此时, SS=1000H, SP=?

1、找栈底,然后“假想”其仅有一个元素,于栈底,在这里,栈底元素内存单元为:1FFFEH、1FFFFH,栈顶 SP 为 FFFEH。

2、将假想元素”弹出“,栈顶 SP=SP+2,此时 SP=1FFFEH+2=1FFFFH+1=0!!!

换一个角度看,任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的地址为栈最底部的字单元的地址+2。栈最底部字单元的地址为1000:FFFE,所以栈空时,SS:SP 为 1000:0,即 SP=0000H

艹,奥运乒乓混双决赛太精彩了,停了大半小时看比赛

将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就在执行push、pop等栈操作指令时自动地将我们定义的栈段当作栈空间来访问。如何使得如push、pop等栈操作指令访问我们定义的栈段呢?前面我们已经讨论过,就是要将SS:SP指向我们定义的栈段。

至于一个栈段可以设置多大?和 CPU 有关系,8086CPU 栈段是 0~FFFFH(即栈顶之变化范围是0~FFFFH) 。

下文是书本原文,我觉得写得太精辟了,请允许我原文奉上:

段的综述

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是 我们自己的安排。

我们可以用一个段存放数据,将它定义为“数据段”;

我们可以用一个段存放代码,将它定义为“代码段”;

我们可以用一个段当作栈,将它定义为“栈段”。

我们可以这样安排,但若要让CPU按照我们的安排来访问这些段,就要:

1、对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我 们定义的数据段中的内容当作数据来访问;

2、对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执 行我们定义的代码段中的指令;

3、对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操 作的时候,比如执行push、pop指令等,就将我们定义的栈段当作栈空间来用。

可见,不管我们如何安排,CPU将内存中的某段内容当作代码,是因CS:IP指向了那里;CPU将某段内存当作栈,是因为SS:SP指向了那里。我们一定要清楚,什么是我们的安排,以及如何让CPU按我 们的安排行事。要非常清楚CPU的工作机理,才能在控制CPU按照我们的安排运行的时候做到游刃有余。

比如我们将10000H〜1001FH安排为代码段,并在里面存储如下代码:

mov ax,1000Hmov ss,axmov sp, 0020H ;初始化栈顶mov ax,csmov ds,ax ;设置数据段段地址mov ax,[0]add ax,[2]mov bx,[4]add bx,[6]push axpush bxpop axpop bx

设置CS=1000H , IP=0,这段代码将得到执行。可以看到,在这段代码中,我们又将 10000H〜1001FH安排为栈段和数据段。10000H〜1001FH这段内存,既是代码段,又是栈段和数据段。

一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不 是。关键在于CPU中寄存器的设置,即CS、IP, SS、SP, DS的指向。

我觉得有一句台词形容 CPU 与段的关系比较贴切:”剑之所指,心之所向。“所谓段,是方便我们程序设计者思考,对 CPU 而言毫无意义,而 DS与偏移量;CS:IP;SS:SP;等等地址,或者说”指针“所指向的目标,才是对 CPU 有意义的指令。

PS:终于在看完混双决赛后,平复激动颤抖的手,写完今天的炉边小坐。在文章的最后想说点无意义的话。看完今天晚上的比赛,再看网友的评论,感觉很糟心。我一直以为,能站上奥运舞台的就是王者,在奥林匹克里,参与比奖牌重要五万倍。你可以说今天男女混双许昕状态不佳,你也可以说水谷隼和伊藤的组合状态更好,但你不能质疑一个运动员的求生欲望,这是不公平的,换一句说,你上去打,0-8 你早就举白旗投降了,凭什么指责他们?输了就再来,日本人也是一直输,直到水谷和伊藤今天夺冠,难道拥有乒乓梦之队的我们,没有耐心和余裕等待下一次比赛吗?自古好事需多磨,如果真的如跳梁小丑,赢了粉输了喷,那真的是输不起,太丑陋了。

2021-7-26 汇编语言 高屋建瓴:栈,段的理解(炉边小坐)相关推荐

  1. 汇编语言随笔(4)-数据段和栈段与mov,add,sub,div,mul、adc、sbb指令

    再次声明,默认采用小端法在内存中存储数据. 在8086PC中,定位一个内存地址需要由段地址和偏移地址一起来完成.注意:当编写指令想要读取某个内存单元中的数据时,需要对偏移地址加上中括号'[ ]'.表示 ...

  2. 前端面试题笔记 2021.8.26

    2021.8.26学习笔记 如果需要匹配包含文本的元素,用下面哪种方法来实现? A. text() B. contains() C. input() D. attr(name) 正确答案: B tex ...

  3. 【题解报告】ZJNU综合训练(2021.1.26)

    [题解报告]ZJNU综合训练(2021.1.26) B C D F H I J M 综合训练 ZJNU综合训练(2021.1.26) B:DP+搜索 | CF 1057C C:组合数学+dp | CF ...

  4. 汇编语言:栈相关知识点

    文章目录 前言 一.概念 二.栈 1.数据 入栈 出栈 2.指令 push pop 3.设置 4.栈顶越界 5.栈的作用 主要作用 临时作用 前言 本文记录汇编语言中栈的概念和内容 一.概念 栈在汇编 ...

  5. 16位汇编 数据段 栈段 代码段

    使用数据段,栈段,代码段 实现置换功能 0123  0456  0789  0abc  0def  0fed    0cba  0987 0987  0cba  0fed   0def   0abc ...

  6. 汇编语言 利用栈 将数据逆序存放

    题目要求 利用栈,将程序中定义的数据逆序存放 数据如下: 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 数据段DS 076A:0000存放的内容 交换 ...

  7. 12、(12.4.2)保护模式下数据段和栈段保护

    1/向下扩展的栈段 实际使用的段界限就是段内不允许访问的最低端偏移地址, (基地址+0)~(基地址+段界限)这段空间是不属于栈段. 举例画图说明: 例1, 基地址为0x00000010,段界限为0x1 ...

  8. 2021.1.26课程摘要(逻辑教育-王劲胜)

    2021.1.26课程摘要 逻辑教育-13期-Python基础班-王劲胜 一.循环控制 二.列表 三.99乘法表 四.作业讲解 逻辑教育-13期-Python基础班-王劲胜 一.循环控制 1.brea ...

  9. 太原理工大学软件学院数据库实验四(2021.4.26)

    太原理工大学软件学院数据库实验四(2021.4.26) -- (1)创建Student 表 CREATE TABLE Student ( Sno CHAR(8) PRIMARY KEY, Sname ...

最新文章

  1. K-近邻算法之特征工程-特征预处理
  2. 文化致胜的时代 协同OA可以这样助力企业文化建设
  3. python笔记基础-python笔记(二)基础二
  4. 利润中心, 成本中心, 工作中心
  5. Eclipse plugin folder
  6. c json输出html标签,Json编码HTML字符串
  7. flutter Toast消息提示框
  8. html语言amp,第二amp;三讲HTML语言.ppt
  9. 摩擦力特点用计算机绘制出,AGC液压缸模拟工况摩擦力特性测试方法研究
  10. 闭包会造成内存泄漏吗?
  11. XMPP聊天环境配置
  12. js map遍历 修改对象里面的值_前端面试之你必须要懂的原生JS
  13. 2021抖音上热门技巧有哪些?
  14. 罗振宇2019-2020“时间的朋友”跨年演讲精华版全文
  15. 骨传导耳机是利用什么原理听歌?什么骨传导耳机好用
  16. 一步一步SEO 之 网站内容SEO
  17. VMware 中CentOS 8设置固定IP同时连接内外网
  18. 设计模式——抽象工厂 Java源代码
  19. 【元胞自动机】元胞自动机交通事故通行【含Matlab源码 1345期】
  20. java----缓存

热门文章

  1. java关于base64加密与生成签名的一种思想,base64中=的含义
  2. 贪吃蛇php源代码,GitHub - fusijie/Snake: CocoaChina Cocos2d-x编程大战:贪吃蛇源码汇总...
  3. android device id 获取主要用于google 服务
  4. DPDK原理探索: igb_uio
  5. MySQL查询练习1
  6. c语言字符串数组数组名与指针
  7. 微信小程序开发入门学习(1):石头剪刀布小游戏
  8. 设计一个安全的排队系统的思考
  9. 仿lex生成器(qt+C++实现)
  10. 计算机等级考试湖南在哪考,湖南省计算机等级考试都考哪些方面?