【CSAPP】背景知识-调用者保存寄存器与被调用者保存寄存器

CSAPP浅学心得 系列文章目录 程序的机器级表示 学习目标: 1、理解程序的汇编拆解以及与指令的关系 2、一元操作、二元操作与移位操作的区别 3、理解条件码、跳转指令、循环和多重分支之间的联系 4、理解程序过程的机器级实现 学习内容: 1、 编译系统 2、 指令 3、 一元操作和二元操作 4、 条件码与跳转指令 5、 循环和多重分支的底层实现 6、运行时栈、转移控制和数据传送 7、栈和寄存器的局部存储与递归 ... 阅读详情
AI摘要

本文介绍了函数调用过程中寄存器%rbx的保存策略,包括调用者保存和被调用者保存。调用者保存是指函数调用前保存寄存器状态,调用后恢复;被调用者保存则是函数内部负责保存和恢复寄存器。在X86-64架构中,%rbx等寄存器遵循被调用者保存原则,而%rax等则遵循调用者保存原则。

1.调用者保存与被调用者保存

函数A调用了函数B,寄存器rbx在函数B中被修改了,逻辑上%rbx内容在调用函数B的前后应该保持一致,
解决这个问题有两个策略,
(1)在函数A在调用函数B之前提前保存寄存器%rbx的内容,执行完函数B之后再恢复%rbx的内容,这个
   策略就称为调用者保存;
(2)函数B在使用寄存器%rbx,先保存寄存器%rbx的值,在函数B返回之前,要恢复寄存器%rbx原来存储
   的内容,这种策略被称之为被调用者保存。

 

2.调用者保存寄存器与被调用者保存寄存器

对于以上的两种策略,对于使用哪一种策略,不同的寄存器被定义成不同的策略。
使用第一种策略的是调用者保存寄存器,使用第二种策略的是被调用者保存寄存器。

3.%rbx是一个被调用者保存寄存器

C语言代码

 对应的汇编代码

4.X86-64中除了%rsp以外的十五个通用寄存器的保存策略

callee saved(被调用者保存)

%rbx ,%rbp,%r12,%r13,%r14,%r15

caller saved(调用者保存)

%r10,%r11,%rax,%rdi,%rsi,%rdx,%rcx,%8,%r9

RISC-V基础之函数调用(三)保留寄存器(包含实例) 非保留寄存器,也称为临时寄存器,是指在函数调用中可以自由修改的寄存器,不需要保存和恢复。函数调用时,如果一个函数需要修改保留寄存器的值,那么它必须在修改前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。而如果一个函数只修改非保留寄存器的值,那么它就不需要保存和恢复它们,因为调用者不会再使用它们。如果一个函数需要修改保留寄存器的值,那么它必须在修改前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。而如果一个函数只修改非保留寄存器的值,那么它就不需要保存和恢复它们,因为调用者不会再使用它们。 阅读详情

相关推荐

GCC的__attribute__((interrupt))你用对了吗?一个属性搞懂调用者与被调用者保存寄存器的区别

本文深入解析GCC的`__attribute__((interrupt))`属性,探讨中断处理函数中调用者与被调用者保存寄存器的区别。通过对比普通函数调用与中断处理的寄存器保存机制,帮助开发者正确使用该属性,确保嵌入式系统的稳定性和性能优化。

weixin_42519985的博客 375

调用者保存寄存器与被调用者保存寄存器

调用者保存寄存器与被调用者保存寄存器调用者保存寄存器(caller saved registers)被调用者保存寄存器(callee saved registers) 调用者保存寄存器(caller saved registers) 也叫易失性寄存器,在程序调用的过程中,这些寄存器中的值不需要被保存(即压入到栈中再从栈中取出),如果某一个程序需要保存这个寄存器的值,需要调用者自己压入栈; 被调用者保存寄存器(callee saved registers) 也叫非易失性寄存器,在程序调用过程中,这些寄存器中的

weixin_44831838的博客 9237

CSAPP大作业:从hello.c到进程的P2P与020全链路解析

在Linux环境下,程序从源代码到运行进程涉及预处理、编译、汇编、链接、进程创建、虚拟内存和IO等核心机制。以经典的hello.c为例,通过gcc、readelf、objdump等工具,可以清晰观察可重定位目标文件、ELF结构、重定位过程以及fork/execve系统调用如何将静态文件转化为动态进程。理解这一完整链路,不仅有助于掌握计算机系统底层原理,还能提升程序调试与性能优化能力。本文以CSAPP实验为背景,详细拆解P2P(Program to Process)和020(从零到零)的每个阶段,提供可复现的

weixin_30984001的博客 307

计算机系统基础-学习记录6

程序的机器级表示:过程(续) 寄存器存储惯例   调用者保存暂存的值在调用者的帧内 被调用者保存暂存的值在被调用者的帧内   对于调用者而言:   %rax用于保存返回值   六个寄存器%rdi,%rsi,%rdx,%rcx,%r8,%r9用于保存参数   超过6个参数后,多出的参数将会通过栈进行传递   调用者需要保存%r10和%r11两个寄存器,之后会用到   对于被调用者而言:   被调用者保存4个寄存器:%rbx,%r12,%r13,%r14   被调用者也保存%rbp(帧指针)(返回时返还)、%r

qq_41959720的博客 1500

CSAPP大作业Hello’s P2P:从源码到进程的全链路验证

编译、链接与加载是理解程序如何从源代码变为进程的必经之路。以经典hello.c为例,它经预处理、编译、汇编、链接生成可执行文件,再由execve加载到虚拟内存,借助页表与TLB完成地址映射,最终在信号、异常控制流与进程调度的交织下运行。无论是分析ELF格式、重定位,还是观察缺页与TLB命中,都是系统底层知识的工程实证。掌握这些原理,不仅有助于排查运行时问题,也能为操作系统、体系结构等方向打下坚实基础。CSAPP的经典大作业“Hello’s P2P”正是将上述全链路串联起来,引导学习者用命令与工具验证每一个阶

weixin_29973493的博客 206

SUMO从入门到精通:手把手教你用开源工具完成智能网联车仿真(附Python接口教程)

本文提供了一份SUMO开源交通仿真工具的完整实战指南,从环境搭建、基础仿真到Python接口TraCI的深度应用。重点讲解了如何利用SUMO的高度可定制性进行智能网联车仿真,包括实现动态信号优先等核心算法,并介绍了与网络仿真器集成以构建高保真车联网通信环境的方法。

weixin_28327051的博客 540

stack frame与缓冲区溢出

CSAPP课后习题3.38,是利用缓冲区溢出来攻击一段程序,使其输出结果为0xdeadbeef。程序的源代码可以从http://csapp.cs.cmu.edu/public/ics/code/asm/bufbomb.c获得。程序的主体是下面两个函数:int getbuf(){     char buf[12];     getxs(buf);     return 1;}void test(

亢龙居 1796

深入解析docx4j:从Word到PDF的高保真转换实战

本文深入解析了如何使用纯Java开源库docx4j实现Word到PDF的高保真转换。针对中文环境,重点讲解了字体映射原理、Linux服务器字体部署方案,并提供了完整的代码示例和配置方法。同时,文章涵盖了表格、图片处理、性能优化及生产环境部署指南,帮助Java开发者构建稳定、可控的文档转换服务。

weixin_29237635的博客 674

抽象在计算机系统中的核心作用:从CSAPP到虚拟机

抽象是计算机系统设计的核心思想,通过分层封装隐藏底层复杂性。进程、虚拟内存、文件等操作系统抽象为应用程序提供统一接口,虚拟机则将整个硬件平台进一步抽象化。理解抽象的原理与边界,能有效应对系统排障、性能优化和虚拟化实践中的挑战。基于CSAPP经典论述,剖析抽象层次、虚拟化机制与抽象谬误,并给出真实排障案例。

weixin_33416697的博客 187

Obsidian笔记同步实战:基于Git的私有化部署与自动化管理

本文详细介绍了如何利用Git为Obsidian笔记构建私有化、自动化且免费的同步方案。通过安装配置Git与Obsidian-git插件,结合Gitee等远程仓库,实现笔记的版本管理、多设备同步与自动备份,打造安全可靠的知识管理体系。

y7z8a的博客 273

VerilogEval实战指南:从基准测试到模型微调的全流程解析

本文提供了VerilogEval实战指南,详细解析了从基准测试到模型微调的全流程。VerilogEval是一个自动化、标准化的测试框架,用于客观评估大语言模型生成Verilog硬件代码的能力。文章涵盖了环境搭建、核心机制解析、利用其生成合成数据进行模型微调的策略,以及如何将其工程化集成到自动化评估流程中,为硬件设计领域的AI应用提供了完整的方法论。

yy01234的博客 1005

【深入理解计算机系统】CSAPP-实验二:BombLab 2020最新详解

前言 本章以“拆解炸弹”为背景,通过gdb调试器对程序进行分析,是一次汇编以及反编译的有趣实践。 本机使用win10 +wsl2.0 + ubuntu18.04完成实验。 点击查看我的全部代码 reference 【施工完成】CSAPP bomb lab 【实战????】手摸手教你Bomb Lab 答案 Border relations with Canada have never been better. 1 2 4 8 16 32 0 207 0 0 ionefg 4 3 2 1 6 5 Phase_1

qq_42234461的博客 2923

IEEE Transactions on Industrial Informatics(TII)投稿全流程解析:从准备到成功提交

本文详细解析了向IEEE Transactions on Industrial Informatics(TII)投稿的全流程,涵盖从投稿前的格式准备、内容结构优化到在线提交系统实操等关键环节。重点强调了遵守TII严格的格式规范、双盲评审要求以及如何构建有说服力的学术叙述,旨在帮助研究者提升稿件质量,顺利通过评审。

weixin_28396629的博客 1864

csapp cachelab_CSAPP:Lab4-Cache Lab

Cache Lab : Understanding Cache Memories1. 实验介绍本次实验分为PartA和PartB两部分。PartA要求写一个小的C程序(大概200~300行)模拟Cache的运行。PartB要求对矩阵转置程序进行优化,将cache miss降到最少。本次实验将帮助你理解Cache的工作机制,以及它对程序性能的影响。2. 背景知识2.1. 动机首先考虑一个问题:为什么...

weixin_39984661的博客 710

艾德克斯电子负载IT8510维修

2年前从朋友那收了这台艾德克斯电子负载,收来的时候上面的编码器就不好用,就是旋转的时候一会增加一会减小这种现象,不过其他功能都是正常的,自己也就将就用这。直到昨天,电子负载开机发现空载的时候电压不是0,开始有mV级的跳动,心想这个不正常。又测试了一下恒流功能,已经不能正常工作了。

mainbanp 4655

FPGA控制AD5754实现模数转换Verilog代码与测试激励

本文提供了使用FPGA控制AD5754芯片实现数字信号转模拟信号的Verilog代码和测试激励。AD5754芯片简介:AD5754是一款16位数字信号转模拟信号的芯片。通信方式:FPGA与AD5754之间通过SPI接口进行通信,SPI时钟clk的最大频率为30MHz。模拟输出:AD5754提供了四路模拟输出。工作方式:当前AD5754采用单极性工作方式。指令刷新:根据现有理解,同轴的速度和电流指令应同时刷新。利用LDAC引脚控制模拟信号的刷新,但需实际验证。CLR信号验证。

whm128的博客 246

《深入理解计算机系统》 CSAPP 第三章 习题 3.72 & 3.75 详解

当函数里有大小在运行时才确定的局部变量(比如用 动态分配的数组),编译器无法在编译期知道 相对于某个基准的偏移量,所以需要用 (帧指针)来"锚定"一个固定的参考点。 汇编代码逐行注释 A. s2 的计算逻辑 目标:为 个 指针分配空间,且 要满足16字节对齐。 第5行: %rax=8n+30\texttt{\%rax} = 8n + 30%rax=8n+30 第6行(AND −16-16−16,即清除低4位): %rax=⌊8n+3016⌋×16\texttt{\%rax} = \left\lf

虾球 436

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

我的所有基于`RV1126`的机器人项目都是在`Ubuntu22.04`下进行开发的,在`Ubuntu18.04 Docker`容器中实现`RV1126`的`SDK`编译,详细可参考我之前的博客[《Ubuntu20.04/22.04下Docker方案实现多平台SDK编译》第2章](https://blog.youkuaiyun.com/w1820020635/article/details/147342689),`RV1126`的`ROS1`部署没什么难度,可以参考我之前的博客,这里记录了`ROS2`交叉编译及问题解决

w1820020635的博客 1143

CSAPP cache lab - Optimizing Matrix Transpose

矩阵转置是一种操作,它将矩阵的行和列互换位置,即将原始矩阵的行变为转置矩阵的列,将原始矩阵的列变为转置矩阵的行。转置操作可以通过改变矩阵的布局来方便地进行某些计算和分析。假设有一个m×n的矩阵A,其转置矩阵为n×m的矩阵B。那么B的第i行第j列的元素就是A的第j行第i列的元素,即B[i][j] = A[j][i]。可以看到,B的第一行是A的第一列,B的第二行是A的第二列,以此类推。矩阵转置在很多领域中都有广泛的应用,例如线性代数、图像处理、矩阵运算等。

weixin_43876597的博客 1713

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CSAPP笔记(第一章 计算机系统漫游)

看的书是第三版pdf版(2016年11月版次), 第一章的内容为p37~p56 第一章讲的比较浅显, 罗列一下 源文件以文本文件的方式保存 不同的上下文中, 同一个字节序列表示不同的意思 源文件被编译系统编译成目标程序, 供系统上执行 C语言经过预编译, 编译器, 汇编器, 链接器, 生成目标程序 了解编译原理, 可以帮助我们优化程序性能, 理解链接出错, 避免安全漏洞 计算机内部包括...

weixin_30315905的博客 171

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

哈工大CSAPP大作业:操作系统内核实现详解

操作系统内核是计算机系统的核心组件,负责管理硬件资源和提供基础服务。其核心原理包括进程调度、内存管理和文件系统等模块,通过系统调用与硬件交互。在工程实践中,理解底层机制如上下文切换、页表映射和TLB协同至关重要。以哈工大CSAPP课程大作业为例,学生需要实现包含进程调度和内存管理的精简内核,这既是对计算机系统理论的验证,也是工程能力的锻炼。通过Docker统一开发环境、QEMU模拟调试等现代工具链,可以高效完成从物理内存分配到文件系统设计的全流程开发。这类实践项目能深化对RISC-V架构、微内核设计等热点的

weixin_29722783的博客 223

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CSAPP 3.72与3.75:栈帧对齐与浮点复数参数传递实战解析

在x86-64系统编程中,栈帧管理与寄存器传参是底层性能优化的核心基础。栈帧通过%rsp和%rbp维护函数调用边界,16字节对齐规则保证了SSE指令的安全执行;浮点复数参数则依据System V ABI,分别占用独立的XMM寄存器槽位。理解这些机制不仅能剖析编译器生成的汇编代码,还能为调试栈溢出、分析调用约定、优化高性能计算场景提供关键支撑。CSAPP 3.72和3.75两道经典习题,恰好覆盖了动态栈分配与复数寄存器传递两大难点,手把手拆解汇编指令,助你打通“数据怎么放、怎么传”的底层逻辑。

weixin_31534091的博客 169

CTF Wiki Pwn 入门:x86 程序函数调用栈与栈内存布局详解

本篇文章是 [CTF Wiki](https://link.gitcode.com/i/211c8ef0ff52dad5c88264bbfd7b8886) Pwn 方向「Linux 用户态 · 栈溢出」系列([导航配置](https://link.gitcode.com/i/beecf1dab4fcb69a5d07adc5ace2b89c))的开篇,系统讲解 x86 程序运行时**栈(Stack)

gitblog_00464的博客 208

CSAPP大作业:实现Unix Shell的底层原理与实践

计算机系统中的进程管理和信号处理是操作系统核心机制,通过fork-exec模型实现程序加载,配合信号机制完成进程间通信。在Linux环境编程中,系统调用如execve和waitpid是控制进程生命周期的关键,而SIGCHLD等信号处理则确保资源回收。这些底层技术支撑了Shell等系统工具的实现,也是理解计算机系统工作原理的重要实践。通过实现简化版Unix Shell的课程项目,开发者可以深入掌握进程控制、I/O重定向和作业管理等核心概念,同时学习使用GDB、Valgrind等工具进行系统级调试。这类实践不仅

weixin_29587015的博客 180

《深入理解计算机系统》 CSAPP 第五章 程序性能优化:5.10 & 5.11 深度解析

优化层次(从高到低收益):1. 算法级别 -> 最重要,换算法可以量级提升2. 循环展开 -> combine1(10.12) -> combine6(0.55),约20倍3. 多累加器 -> 打破串行依赖链,接近吞吐量下界4. 消除不可预测分支 -> 避免20周期惩罚5. SIMD向量化 -> 进一步4x~8x提升优化措施CPE变化原理多级循环展开打破循环开销与数据依赖寄存器展开适度避免溢出超过16个累加器反而变慢函数式风格触发cmov,消除分支预测失败SIMD指令。

虾球 316

【无标题】

缓冲区溢出实战:从一次崩溃到劫持程序 (Buffer Overflow Writeup)作者:liweiqi | 信息安全 准大一新生类型:安全入门实战 / CSAPP 学习实验关键词:缓冲区溢出、栈、返回地址、gdb、小端序。

liweiqi4919的博客 221
上一篇: C++中整数转成字符串的方法
下一篇: 【经典阅读】CSAPP-3.4.0-访问信息-导读-寄存器
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值