2021-7-26 汇编语言 高屋建瓴:栈,段的理解(炉边小坐)
聊了那么多,是时候简短的总结一下栈和段。
栈的综述
8086CPU提供了栈操作机制,方案如下。
1、在SS、SP中存放栈顶的段地址和偏移地址;
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、push、pop实质上是一种内存传送指令,注意它们的灵活应用。
对于段,很多同学不太理解段这个概念,对于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 汇编语言 高屋建瓴:栈,段的理解(炉边小坐)相关推荐
- 汇编语言随笔(4)-数据段和栈段与mov,add,sub,div,mul、adc、sbb指令
再次声明,默认采用小端法在内存中存储数据. 在8086PC中,定位一个内存地址需要由段地址和偏移地址一起来完成.注意:当编写指令想要读取某个内存单元中的数据时,需要对偏移地址加上中括号'[ ]'.表示 ...
- 前端面试题笔记 2021.8.26
2021.8.26学习笔记 如果需要匹配包含文本的元素,用下面哪种方法来实现? A. text() B. contains() C. input() D. attr(name) 正确答案: B tex ...
- 【题解报告】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 ...
- 汇编语言:栈相关知识点
文章目录 前言 一.概念 二.栈 1.数据 入栈 出栈 2.指令 push pop 3.设置 4.栈顶越界 5.栈的作用 主要作用 临时作用 前言 本文记录汇编语言中栈的概念和内容 一.概念 栈在汇编 ...
- 16位汇编 数据段 栈段 代码段
使用数据段,栈段,代码段 实现置换功能 0123 0456 0789 0abc 0def 0fed 0cba 0987 0987 0cba 0fed 0def 0abc ...
- 汇编语言 利用栈 将数据逆序存放
题目要求 利用栈,将程序中定义的数据逆序存放 数据如下: 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 数据段DS 076A:0000存放的内容 交换 ...
- 12、(12.4.2)保护模式下数据段和栈段保护
1/向下扩展的栈段 实际使用的段界限就是段内不允许访问的最低端偏移地址, (基地址+0)~(基地址+段界限)这段空间是不属于栈段. 举例画图说明: 例1, 基地址为0x00000010,段界限为0x1 ...
- 2021.1.26课程摘要(逻辑教育-王劲胜)
2021.1.26课程摘要 逻辑教育-13期-Python基础班-王劲胜 一.循环控制 二.列表 三.99乘法表 四.作业讲解 逻辑教育-13期-Python基础班-王劲胜 一.循环控制 1.brea ...
- 太原理工大学软件学院数据库实验四(2021.4.26)
太原理工大学软件学院数据库实验四(2021.4.26) -- (1)创建Student 表 CREATE TABLE Student ( Sno CHAR(8) PRIMARY KEY, Sname ...
最新文章
- K-近邻算法之特征工程-特征预处理
- 文化致胜的时代 协同OA可以这样助力企业文化建设
- python笔记基础-python笔记(二)基础二
- 利润中心, 成本中心, 工作中心
- Eclipse plugin folder
- c json输出html标签,Json编码HTML字符串
- flutter Toast消息提示框
- html语言amp,第二amp;三讲HTML语言.ppt
- 摩擦力特点用计算机绘制出,AGC液压缸模拟工况摩擦力特性测试方法研究
- 闭包会造成内存泄漏吗?
- XMPP聊天环境配置
- js map遍历 修改对象里面的值_前端面试之你必须要懂的原生JS
- 2021抖音上热门技巧有哪些?
- 罗振宇2019-2020“时间的朋友”跨年演讲精华版全文
- 骨传导耳机是利用什么原理听歌?什么骨传导耳机好用
- 一步一步SEO 之 网站内容SEO
- VMware 中CentOS 8设置固定IP同时连接内外网
- 设计模式——抽象工厂 Java源代码
- 【元胞自动机】元胞自动机交通事故通行【含Matlab源码 1345期】
- java----缓存
热门文章
- java关于base64加密与生成签名的一种思想,base64中=的含义
- 贪吃蛇php源代码,GitHub - fusijie/Snake: CocoaChina Cocos2d-x编程大战:贪吃蛇源码汇总...
- android device id 获取主要用于google 服务
- DPDK原理探索: igb_uio
- MySQL查询练习1
- c语言字符串数组数组名与指针
- 微信小程序开发入门学习(1):石头剪刀布小游戏
- 设计一个安全的排队系统的思考
- 仿lex生成器(qt+C++实现)
- 计算机等级考试湖南在哪考,湖南省计算机等级考试都考哪些方面?