栈的作用:

栈是过程调用与返回机制的基础部分
①CALL和RET配合,实现子程序
②解决寄存器冲突,调用子程序时,子程序中使用了哪些寄存器,就把哪些寄存器的值压到栈中(暂存),等子程序结束,再将这些值pop出来

栈在程序刚启动的时候就已经分配好了,假设当前栈如下图,那么需要注意4位置叫做栈顶,而不是3,那么CPU是如何知道栈顶是多少的呢?是根据SS:SP寄存器来算出来的,具体算法可以参考这里

8086CPU中入栈和出栈都是以字为单位的,也就是两个字节为单位,且栈的低位存放字的低位,栈的高位存放字的高位,假设有16进制数字1234H那么它在内存中是下面这样

我们说1234H的地址是6,而不是1234H的地址是7,这点千万要注意

PUSH指令
格式:push 操作数;
操作数可以是立即数,例如

_asm {push 0x1122;add esp, 4;
}

操作数也可以是寄存器,例如

_asm {mov eax, 0x1122;push eax;add esp, 4;
}

注意:当调用push指令的时候,ESP寄存器会自动减(小端法)操作数的大小,例如push一个int,esp会自动减4,当程序执行完毕的时候,需要注意将esp恢复回去,这也是上述示例为何要调用add指令的原因

POP
与push是成双成对出现,有几个push,就有几个pop
格式:pop 寄存器
说明:操作数占几个字节,就从栈顶复制几个字节放到寄存器中,注意此处复制一次,平时都说从栈顶弹出,弹出的本意其实是一个复制的动作,而不是剪切的动作,只不过栈顶的位置变了而已

下面例子是操作数为寄存器的情况

#include <iostream>
int main() {int a = 0;_asm {push 666;pop eax;mov a, eax;}std::cout << a << "\n";
}

栈的作用:栈是用来暂存以后需要恢复的寄存器的内容的一个数据结构,个人觉得认为栈是高级语言方法(java)或函数(c++)使用的数据结构,是很肤浅的想法,本质上就是用来恢复寄存器的内容的

传送指令:传送两个字指的是内存与寄存器之间相互传送数据,而push和pop恰好就属于传送指令


计算机系统-理论-运行时堆栈/栈顶相关推荐

  1. Linux中如何获得进程的运行时堆栈

    关于这个话题,我们一般是为了处理一下生产环境中程序出现死循环或者死锁等问题.我们一般想到的方法就是gdb attach上一个运行中的进程.但是这个需要手动交互.通过网上查找和实践,可以有以下几种选择: ...

  2. 【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )

    文章目录 I . 默认启动模式 ( standard ) II . 栈顶复用启动模式 ( singleTop ) III . 栈内复用启动模式 ( singleTask ) IV . 单实例启动模式 ...

  3. 基于 Java 2 运行时安全模型的线程协作--转

    在 Java 2 之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox).读者应该熟悉,Java 不受信的 Applet 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...

  4. OpenGL的glPushMatrix和glPopMatrix矩阵栈顶操作函数详解

    OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的.opengl中的变换一般包括视图变换.模型变换.投影变换等,在每次变换后,opengl将会呈 ...

  5. opengl-函数讲解 glPushMatrix和glPopMatrix矩阵栈顶操作【转载自追寻1024的程序猿 】

    阅读目录 OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的.opengl中的变换一般包括视图变换.模型变换.投影变换等,在每次变换后,open ...

  6. 关于栈顶指针初值为-1和0的区别

    关于栈顶指针初值为-1或者0 的区别(c语言) 栈顶指针:S.top 栈顶元素:S.data[S.top] 当栈顶指针的初始值设置 S.top=-1时 ps: 当栈为空时,栈顶指针指向data[-1] ...

  7. 顺序栈(含有栈顶指针,栈底指针)的实现以及编写过程中的一些疑惑的解决

    参考文献:数据结构(c语言版)---严蔚敏p44----->p47 代码如下: #include<stdlib.h>//malloc realloc #include<iost ...

  8. 【数据结构】-顺序栈(初始化栈顶指针为0)

    顺序栈-初始化栈顶指针为0 1.头文件及类型定义 2.顺序栈类型定义 3.函数声明 4.基本操作 4.1 初始化顺序栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main ...

  9. oracle.net sdk,删除 .NET 运行时和 SDK | Microsoft Docs

    如何删除 .NET 运行时和 SDKHow to remove the .NET Runtime and SDK 03/02/2021 本文内容 经过一段时间后,在安装 .NET 运行时和 SDK 的 ...

最新文章

  1. 阿里mysql同步工具otter的docker镜像
  2. java程序员需要考证_泄题了!Java程序员最可能被考到的14个面试题
  3. 理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤
  4. HDU多校3 - 6797 Tokitsukaze and Rescue(dfs+最短路)
  5. java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)
  6. asp.net调试技巧
  7. windows下javadoc生成文档注释的命令
  8. PHP 执行系统命令函数
  9. 教你如何用python获得中国气象数据网的API数据并且导入数据库(附源码)
  10. PDG格式转换PDF格式的方法
  11. java习题5参考练习及答案_JAVA练习题(第5章).ppt
  12. 如何寻找已知轮廓的最大内接圆
  13. 华为2019秋招笔试题2
  14. 未来瓶窑的交通生命线与发展规划
  15. IP Camera 基础知识
  16. 04 - SSH攻击Linux服务器(简单)
  17. 案例详解:理解Python中的“解析式”
  18. git查看stash里面的具体内容
  19. 模拟幂律分布(附C语言代码)
  20. 云计算机专用显示器,电视秒变电脑显示器客厅云电脑操作方法

热门文章

  1. oracle同机单实例加入集群,将oracle同机单实例加入rac集群的操作步骤
  2. git已经删除了远程分支,但本地环境仍能看到远程分支
  3. MySQL修改主键初始值为1
  4. pl/sql连接Oracle数据库的方式
  5. mysql 查询姓王_MySQL查询语句练习题,测试足够用了
  6. 食物和计算机中一样的英语,关于电脑和食物的英语口语
  7. python程序员怎么建议_资深程序员对Python新手的八个建议,超级实用!
  8. linux 在文件中增加空行,linux – 在不同组的行之间添加空行
  9. 河北金融学院计算机与科学,河北金融学院计算机科学与技术专业2016年在河北理科高考录取最低分数线...
  10. python导入图片语法_MarkDown添加图片的三种方式