堆栈算是非常重要的结构了,今晚讲讲它是怎么设计的,最后讲几个跟堆栈相关的汇编指令。

初识堆栈结构

之前学过那些通用寄存器,读取方便,而且快速,但是有一个问题:就是寄存器有大小限制,数据量大的时候,寄存器就不够用了。为了实现存取大量的数据,并且能快速读取数据,前人发明了堆栈的结构。

堆栈的结构是这样的,分配一段连续的内存,定义两个变量BASE(栈底)、TOP(栈顶)。

BASE(栈底)里面保存一个地址,记录该连续内存(堆栈)的起始地址。

TOP(栈顶)里面保存一个地址,记录该连续内存(堆栈)的结束地址。

这两个变量保存栈底、栈顶的内存地址,这两个变量的值(内存地址)分别保存通用寄存器EBP和ESP中。

说那个多,来点实在的,看看OD中的堆栈长什么样的吧。

可以看到堆栈就是一块连续的内存,只不过这段连续的内存的开始地址保存在EBP寄存器中,结束地址保存在ESP中。这么看,其实堆栈也没想的那么复杂。大家可能也注意到OD的堆栈中栈顶的地址的背景色是深黑色的。

向栈中放入一个数(假设4个字节)时,TOP(栈顶)的值减4。可以看下面的示意图。

向栈中放入一个数的过程,叫入栈。在windows系统中,栈是向低位扩展的,所以入栈的时候地址是减去一个数。

在OD中执行了一条入栈的命令,可以看到这样的结果。

从栈中取出一个数(假设4个节字)时,BASE(栈底)的值加4。可以看下面的示意图。

  从栈中取出一个数的过程,叫出栈可以看到出栈时,只是把栈顶的地址改变,并没有去删除原来栈顶的值。

在OD中执行一条出栈的命令,可以看到原来栈顶的值还是存在内存中的。

如果要读取栈中间的某个值,可以通过栈顶或栈底加上一个偏移量的方式去读取。

可以看到用这种方式读取内存的数据非常快,直接加偏移量就能读取内存中的值。

详细说说入栈、出栈

入栈时,在OD中可以发现,ESP中的值减了4,栈顶上移,并且把值放入到栈顶中。我们可以用已经学过的指令实现这一过程。

mov dword ptr ds:[ESP-4],0xA

sub ESP,0x4

当然还有其他的方式实现。

其实汇编中还有一个更好用的指令实现入栈的过程:push指令。

push指令

格式:push r32/r16/m16/m32/imm8/imm16/imm32

例子:push eax :把EAX寄存器中的值压入栈中。

执行前栈的情况

执行后栈的变化情况 

出栈时,也可以用已经学过的指令来实现。

mov EAX, dword ptr ds:[ESP]

add ESP,0x4

当然汇编中也有一条命令实现出栈的过程:pop指令

pop指令

格式:pop r16/r32/m16/32   注意pop后面不能是立即数,因为pop后面要有一个容器接收从栈中取出的数。

例子:pop ecx :把栈顶的值取出放入到ECX寄存器中。

执行前栈的情况

执行后栈的情况

几条跟堆栈扯上关系的汇编指令相关推荐

  1. 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)

    拼多多现在也是越来越火了,但是不知道大家有没有发现,拼多多似乎一直不能通过网页进行访问.淘宝,京东都有微信客户端,那么怎么拼多多就没有呢?带着这个疑问,我特地去手机爬取了一下拼多多的客户端.(其实也不 ...

  2. 大数据+AI能与碳中和扯上关系?看这家新能源企业如何操作

    当 AI 进入落地期,认真思考如何打通大数据与 AI 应用的关联,才是企业眼前既现实.又关键的一大挑战. 2020 年 9 月,中国政府提出了 2060 年前实现碳中和的目标,此后,这一概念的热度节节 ...

  3. 防火墙公司怎么跟天气预报扯上关系?

    导读:每天新闻联播后的<天气预报>,是很多中国老百姓每晚必看的节目.准确的天气预报,离不开气象局的庞大业务系统网络,而在背后守护这个业务网络的,是网康的NGFW. 气象局业务网,其实离你我 ...

  4. 【高并发】ReadWriteLock怎么和缓存扯上关系了?!

    作者个人研发的在高并发场景下,提供的简单.稳定.可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能.自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验 ...

  5. 大凉山的美术课,怎么就跟英特尔扯上关系了

    允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 如果说非要有一个领域. 它面临的问题亘古而又绵长,却总是吸引诸多技术流玩家前来应战. 那教育一定当属其中之一. 教育资源分配不均.因材施教理 ...

  6. 卡巴斯基泄密?遭美国封杀!微软也扯上关系

    最近,美国政府部门和媒体对于俄罗斯安全软件卡巴斯基发起了全方位的抨击和封杀,指责其与俄罗斯间谍勾结,攻击了美国国安局(NSA)一名雇员的电脑,并窃走了部分机密文件. 据称,被窃文件属于美国NSA旗下的 ...

  7. 电子烟跟新冠扯上关系了?专家:快停止吸电子烟

    全文共1873字,预计学习时长6分钟 图源:unsplash 当新冠病毒最开始传播时,很多数据给了我们这样的认知:新冠对老年人威胁更大.我国的早期数据显示:60岁以上的人和具有严重潜在健康问题的人更有 ...

  8. 西医和魔法扯上关系的岁月

    ​" 魔法元素混乱造成生病......" 0 魔法元素与生病 作为码农,死宅的属性标签中.游戏必不可少,偏西方的游戏或者魔法世界里.土水气火是四大基本元素. 冰风谷系列,龙与地下城 ...

  9. 内存地址、机器码与汇编指令的三角恋关系

    虽然机器码和内存地址领证在一起了,但是俩个人都和汇编指令有着说不清的关系,机器码的前任是汇编指令,而汇编指令又与内存地址暗地相通,这究竟是道德的沦丧还是人性的扭曲,今天就让我来领大家细细分解这三者的前 ...

最新文章

  1. postgresql高可用_Postgresql高可用实现方案
  2. 深夜文献:2021腾讯科技WE大会硬核复习资料,看看如何烧脑?
  3. 开源 java CMS - FreeCMS2.8 自定义标签 siteOne
  4. opencv-视频处理-实时的前景检测-Vibe算法
  5. 捕捉不可控iframe的close事件_湖南大学王建锋团队:光/湿驱动的超快可逆可控致动器...
  6. Javascript的调试利器:Firebug使用详解
  7. 考研过程中最容易犯的八大错误
  8. C/C++ 获取本地日期时间常见方法
  9. java中h1.j有什么作用_Android JNI学习之javah命令的正确使用(找了好半天才找到的,汉,网上好多说法都没用)...
  10. 没有什么能难倒程序员,教你如何下载付费歌曲
  11. 如何在视频中加水印?分享这些实用的加水印方法给你
  12. 关于平衡组的一个例子
  13. canvas模拟实现高德地图的部分功能
  14. python average函数详解_python基础之函数详解
  15. “怀孕后,老公居然背着我做这些事”:有没有嫁对人,看这点就知道了
  16. LATEX之对文章排版的相关设置
  17. MODBUS通讯协议学习总结
  18. 什么是带状线、微带线?参考平面与传输线那些事儿
  19. vue使用vue-video-player实现web视频直播展示m3u8格式
  20. HIVE:窗口函数,用sql语句查询MySQL安装路径和版本

热门文章

  1. Html.ActionLink 几种重载方式说明及例子
  2. Silverlight 4正式版发布
  3. [文摘20090224]天干和地支
  4. 解决ERROR 2003 (HY000): Can't connect to MySQL server on host (111)
  5. python3 all any 判断迭代参数 是否全部 是否有 为true
  6. golang 数据类型 简介
  7. linux top 命令信息解释
  8. python3 获取异常类型
  9. linux shell sleep usleep 延时命令 秒 毫秒 微秒
  10. python3 打印异常堆栈信息