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

Csapp-chapter3-压栈和弹栈

bp与sp(压栈和弹栈)

在计算机内部的寄存器组中,有一对寄存器非常有意思:%ebp,%esp


文章目录

  • bp与sp(压栈和弹栈)
  • 寄存器组示例图
  • %ebp与%esp
  • 总结


寄存器组示例图

首先我们应该对于计算机中的寄存器组有一个逻辑的认知:
以X86_64为例对其中的通用寄存器组做出了逻辑图示如下链接:
X86_64寄存器组图示


%ebp与%esp

这个寄存器叫做堆栈基址寄存器,被调用者保存,而其保存的内容则是调用者的栈底。

比如下方的一段代码

#include<stdio.h>void A(int n){printf("n=%d\n",&n);
}void B(){int a=1;A(a);
}int main()
{B();
}

对于上述代码执行时的栈:
首先忽略系统区,main函数在栈底,然后在main函数中把B函数入栈,由于B中调用了A,在B之后又将A入栈。其中%ebx,就始终指向一个函数的栈区的底部。而%esp则始终指向函数栈区的顶部,这里简称为栈顶。

指令效果描述
pushq SR[%rsp]<-R[%rsp]-8
M[R[%rsp]]<-S
将四字压入栈
popq DD<-M[R[%rsp]]
R[%rsp]<-R[%rsp]+8
将四字弹出栈

总结

总之这块很简单,只需记住
压栈先挪出空间(sp减去某个值),再填数据
弹栈先保存要弹出的数据,再释放空间(sp加上某个值)
值得注意的是,弹栈后原数据还在,只是不再被栈顶指针所指,而是等待着下一次数据的覆盖

http://www.lryc.cn/news/297786.html

相关文章:

  • Rust入门1——HelloWorld
  • android中使用Bitmp对象绘制图形
  • Linux操作系统基础(八):Linux的vi/vim编辑器
  • nginx限制网段访问
  • Linux开机自动执行自定义脚本或命令
  • 【Linux】 网络编程套接字
  • MATLAB矩阵的操作(第二部分)
  • 基础面试题整理6之Redis
  • MySQL基础查询篇(7)-常用的字符串函数
  • 如何实现视线(目光)的检测与实时跟踪
  • STM32 FSMC (Flexible static memory controller) 灵活静态内存控制器介绍
  • 手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息维护模块UI设计实现
  • SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配
  • git恢复rebase过程中遇到权限问题和丢失的提交
  • Spring boot 集成redis
  • c++ STL系列——(一)概述
  • AI-数学-高中-25-三角函数一图像解决三角函数不等式
  • 在Ubuntu上安装JetBrains Toolbox并解决libfuse.so.2依赖问题
  • 在vscode上传项目到gitee
  • 比较两次从接口获取的数据,并找出变动的字段
  • Java并发基础:LinkedBlockingDeque全面解析!
  • Zabbix6.x配置中文界面 解决乱码问题
  • next项目页面性能调优
  • 性能评测|虚拟化和裸金属 K8s 哪个性能更好?
  • 【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系
  • 计算机毕业设计基于的农村蔬菜销售系统SSM
  • 【Chrono Engine学习总结】3-地型terrain
  • 【Linux】构建模块
  • vscode远程连接失败
  • C#系列-C#访问FTP服务器实现上传下载(8)