Linux使用x86-64(AMD64)架构的System V ABI; 有关详细信息,请参见OSDev Wiki上的System V ABI。

这意味着堆栈变小。 较小的地址在堆栈中“较高”。 典型的C函数被编译为

pushq %rbp ; Save address of previous stack frame

movq %rsp, %rbp ; Address of current stack frame

subq $16, %rsp ; Reserve 16 bytes for local variables

; ... function ...

movq %rbp, %rsp ; \ equivalent to the

popq %rbp ; / 'leave' instruction

ret

为局部变量保留的内存量始终是16个字节的倍数,以使堆栈对齐到16个字节。 如果局部变量不需要堆栈空间,则没有2982409126032180180224或类似指令。

(请注意,返回地址和前一个2982409126048957957440都被压入堆栈,大小均为8个字节,共16个字节。)

%rsp指向当前堆栈框架,而%rsp指向堆栈顶部。 由于编译器在函数内的任何点都知道rep ret和ret之间的区别,因此可以随意使用其中任何一个作为局部变量的基础。

堆栈框架只是本地函数的游乐场:当前函数使用的堆栈区域。

每当使用优化时,当前版本的GCC都会禁用堆栈框架。 这是有道理的,因为对于用C编写的程序,堆栈帧对于调试最有用,而其他方面则没什么用。 (不过,您可以使用2982409126048048957440保持堆栈帧,同时启用其他优化功能。)

尽管相同的ABI应用于所有二进制文件,但是无论它们以何种语言编写,某些其他语言的确需要使用堆栈框架来“展开”(例如,向当前函数的祖先调用者“抛出异常”); 即“展开”堆栈帧,可以中止一个或多个功能并将控制权传递给某些祖先功能,而无需在堆栈上保留不必要的内容。

当省略堆栈帧时-对于GCC为%rsp-函数实现本质上将更改为

subq $8, %rsp ; Re-align stack frame, and

; reserve memory for local variables

; ... function ...

addq $8, %rsp

ret

因为没有堆栈帧(%rsp用于其他目的,并且其值从不被压入堆栈),所以每个函数调用仅将返回地址压入堆栈,这是一个8字节的数量,因此我们需要减去8 从%rsp保留为16的倍数。(通常,从rep ret减去并加到rep ret的值是8的奇数倍。)

函数参数通常在寄存器中传递。 有关详细信息,请参见此答案开头的ABI链接,但总而言之,整数类型和指针在寄存器%rsp、%rsp、rep ret、ret、rep和ret中传递,而2982409126048957957446至2982409126048447中带有浮点参数。

在某些情况下,您会看到%rsp而不是%rsp。不要混淆:rep ret的含义与ret完全相同。 尽管通常将2982409126048957957444前缀与字符串指令(重复的指令)一起使用,但将其应用于ret指令时却没有任何作用。 只是某些AMD处理器的分支预测变量不喜欢跳转到ret指令,建议的解决方法是在该处使用rep ret。

最后,我忽略了堆栈顶部上方的红色区域(地址小于2982409126048957957440的128个字节)。 这是因为它对于典型功能并不是真正有用:在正常的had-stack-frame情况下,您希望将本地内容放在堆栈框架中,以使调试成为可能。 在省略堆栈框架的情况下,堆栈对齐要求已经意味着我们需要从2982409126048957957441中减去8,因此在该减法中包括局部变量所需的内存不会花费任何成本。

linux中寄存器的作用是什么,c-x86_64汇编器中RBP寄存器的作用是什么?相关推荐

  1. linux内核编程memcpy,memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器...

    memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器 (2013-05-18 18:42:25) 标签: 内核 汇编 指定 杂谈 memcpy Linux内核实现引发的思考: ...

  2. Linux五部分的含义,Linux 目录下部分重要目录的用途及含义及一些命令的作用

    Linux根目录下部分重要目录的用途及含义 /proc:这个目录是系统内存的映射,我们可以直接访问这个目录来获取系统信息.也就是说,这个目录的内容不在硬盘上而是在内存里. /sys:系统 (syste ...

  3. Linux系统学习: 进程、重定向和管道指令:xargs 指令的作用是

    进程 为了弄清楚这节课程的内容,也就是管道,我们先来讨论一下进程. 我们知道,应用的可执行文件是放在文件系统里,把可执行文件启动,就会在操作系统里(具体来说是内存中)形成一个应用的副本,这个副本就是进 ...

  4. 量子计算机的基本构成,量子计算机的硬件单元 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器。假设有一个由3比特构成的寄存器,在经典计算机中,可... - 雪球...

    来源:雪球App,作者: 书生剑客,(https://xueqiu.com/3993902801/178623085) 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器.假设有一个 ...

  5. linux 命令缓存机制(命令:hash) | hash -r使用场景和作用

    文章目录 linux 命令缓存机制(命令:hash) | hash -r使用场景和作用 什么是hash 缓存表 hash命令 hash -r使用场景和作用 linux 命令缓存机制(命令:hash) ...

  6. linux中tcp/ip协议实现及嵌入式应用 下载,LINU中TCPIP协议实现及嵌入式应用

    好文网为大家准备了关于LINU中TCPIP协议实现及嵌入式应用范文,好文网里面收集了五十多篇关于好LINU中TCPIP协议实现及嵌入式应用好文,希望可以帮助大家.更多关于LINU中TCPIP协议实现及 ...

  7. Linux高级运维(十)-搭建企业中最常用缓存代理服务器Squid , Varnish

    搭建varnish 缓存代理服务器 需求: 使用Varnish加速后端Web服务,代理服务器可以将远程的Web服务器页面缓存在本地,远程Web服务器对客户端用户是透明的,利用缓存机制提高网站的响应速度 ...

  8. linux vim 命令无效,【工匠大道】一些Vim(Linux)不常见但很逼格的命令(不断更新中)...

    分享提纲: 普通的vim的移动,编辑等命令就不再赘述.这里主要是记录一些不常见但是很逼格的命令,使你瞬间感到精神为之一振的命令 1. :Tlist 1)该命令是列出当前文件中的类名,变量名和函数名,移 ...

  9. python中点的作用_一分钟了解Python中“*”的作用

    一分钟了解Python中"*"的作用 在为函数传递参数和函数定义时使用参数的时候,时常会看到有和 *和**,下面分别讲解其作用. 调用函数时使用*和 ** 假设有函数 def te ...

  10. MVC中业务层是否应该有个基类?它有什么作用?

    项目架构N层结构中,业务层无疑是比较灵活多变,与数据库层紧密联系,又同时约束WEB层的中间层,它是否应该有个基类,而如果有,那它的作用又是什么呢? 这就是今天要说的. 首先,我认为每个层都应该有个基类 ...

最新文章

  1. 清华大学为何把突出贡献奖颁给他?看完这个我就懂了
  2. (转)mq经验总结-转
  3. 密码统计分析工具pipal
  4. 怎么让div显示一行,其余的隐藏。
  5. 电脑上的科学计算机怎么用,电脑上怎么快速打开计算器
  6. Android Studio 使用入门及问题汇总
  7. asp.net的几种简单连接数据库方法
  8. Python实战2 - 200行Python代码实现2048(控制台)
  9. c语言 正号运算符 作用,C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,...
  10. 下载 LINUX 和 windows 版本下 MySQL5.7.32
  11. 解决仙剑奇侠传“应用程序无法正常启动(0xc000000d)”的问题【转载】
  12. POC会成为下一个POW吗?
  13. centos解压分卷rar_linux命令:tar分卷压缩与合并解压缩
  14. 我在CSDN的2021--一次没有专栏的写在尾声
  15. 企业邮箱登录入口,邮箱登陆登录入口有哪些?
  16. android 极光推送1011,两条推送信息,一条推送成功,一条推送失败(errcode:1011,errmsg:没有满足条件的推送目标)...
  17. 日本现场常用日语词汇
  18. 基于51单片机的电动智能小车(完整论文)
  19. 多尺度动态图卷积神经网络----Multi-scale Dynamic Graph Convolutional Network for Hyperspectral Image Classificati
  20. python 智禅_禅道是什么意思:非禅不智,非智不禅

热门文章

  1. MSSQLSERVER 2019修改数据库文件存放路径的简单实现
  2. 三维点云数据集汇总(分类+检测+识别)
  3. mactxt文件如何转换成html,最佳的用于Mac上的PDF文件转换到HTML文件的转换器
  4. 一年两款新品 寒武纪的研发效率为何如此高?
  5. cmd 更改计算机名
  6. 岗位po是什么意思_通信公司中PO和PM分别是什么意思?
  7. logTracker错误日志跟踪组件(二)
  8. 阿里云redis学习笔记
  9. Python爬虫神器pyppeteer,对 js 加密降维打击
  10. 大数据技术之Hadoop概述集群环境搭建常见错误解决等