【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二

  • 上一篇文章学习了ABI的相关内容,具体最后分析了不同ABI下结构体的对齐方式的不同。点击链接查看上一篇文章:【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一
  • 本篇文章继续学习ABI相关内容。是上一篇文章的补充,如果没有看过上一篇文章,一定要看上一篇文章。

文章目录

  • 1 ABI定义了硬件寄存器的作用
  • 2 ABI下的函数调用约定
  • 3 总结

1 ABI定义了硬件寄存器的作用

我们熟悉的寄存器的作用,没想到也是ABI规范中的一员!!!

  • 寄存器,是处理器用来存储数据和运行程序的重要载体。

  • 一些寄存器在处理器设计好的时候,它们的功能就已经确定好了的。

下面简单介绍几种寄存器的功能:

  • EIP (指令指针寄存器):始终指向处理器下一条要执行的指令
  • ESP (栈顶指针寄存器):指向当前运行栈的栈顶
  • EBP (栈帧基址寄存器):指向函数栈帧基址,用于定位运行栈中的其他参数的

向以上的寄存器都是特定用处的寄存器。下面的是X86平台下的通用寄存器的作用:
在这里插入图片描述

  • 不管它是通用寄存器还是特定寄存器,实际上都是由ABI规范规定的。

除了X86平台的寄存器规范,下面还列出了PowerPC寄存器的ABI规范:
在这里插入图片描述

2 ABI下的函数调用约定

函数调用我们很清楚是怎么回事。但是函数发生调用时,背地里可是发生了不少事。

发生了那么多事我们现在只关心两件事:

当函数发生调用时:

  • 参数会传递给被调用的函数。这里面参数肯定是被送到了被调用函数的运行栈中。这里面就有一个问题!!!参数如何传递?是从右向左的送给运行栈中,还是从左向右?毕竟函数往往都有多余一个的参数,我们不得不考虑这个问题。
  • 当函数调用结束后,会返回到之前的函数。那么刚刚被调用函数所使用栈由谁来清理?是由被调用的函数自己清理?还是由之前的调用函数来清理?

以上问题,虽然在编程中,我们并没有去关注,但是理解它总没有坏处的。

以上问题,我们熟知的一种ABI规范,也是大多数平台的ABI规范:函数调用时参数是从又往左入栈的。由被调用函数来负责清理栈。

感觉上是我们不会用到ABI的规范。但是如果你是一个库开发者,就需要对这个有所了解了。

比如下面的图示:
在这里插入图片描述

  • 如果A编译器与B编译器所遵循的ABI规范不一致,那么久无法工作。

3 总结

  • ABI定义了硬件寄存器的只用方式
  • ABI定义了函数调用时需要遵守的调用约定。

欢迎加我好友共同探讨学习交流各种技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net中RegularExpressionValidator控件中正则表达式用法

验证数字: 只能输入1个数字 表达式 ^\d$ 描述 匹配一个数字 匹配的例子 0,1,2,3 不匹配的例子 只能输入n个数字 表达式 ^\d{n}$ 例如^\d{8}$ 描述 匹配8个数字 匹配的例子 12345678,22223334,12344321 不匹配的例子 只能输入至少n个数字 表达式 ^\d{n,}$ 例如^\d{8…

VS2017社区版30天到期无法使用的激活方法

VS2017社区版30天到期无法使用的激活方法VS2017社区版是免费的,但是第一次安装时,没有登录,导致只要30天的试用期,现在试用期结束,无法使用,本教程就是解决这个问题。我先在控制面板中将2017社区版软件卸载…

设计师提高水平秘籍

要提高设计水平,前提当然是必须掌握基本的软件技术和了解专业的理论知识等。以下是迅速提高设计水平的九大秘诀。一,想设计师首先必须善于思考,对设计主张自己的想法和理解,这是最重要的。别担心你的想法有多“烂”,没…

五分钟搞懂内网和外网之间的通信的原理

写的通熟易懂,特转过来备忘!原创链接找不到了 对于初学者而已,我们学习的网络编程(如TCP,UDP编程),我们通常都是在局域网内进行通信测试,有时候我们或者会想,我们现在写的内网网络数据和外网的网络数据有什…

Linux设备驱动程序学习(4) -高级字符驱动程序操作[(1)ioctl and llseek]

今天进入《Linux设备驱动程序(第3版)》第六章高级字符驱动程序操作的学习。 一、ioctl 大部分设备除了读写能力,还可进行超出简单的数据传输之外的操作,所以设备驱动也必须具备进行各种硬件控制操作的能力. 这些操作常常通过 io…

markdown文本居中方法(CSDN博客编辑器文本居中方法)

居中居中使用html添加&#xff1a;   <center>这一行需要居中</center> 比如: <center>居中</cenetr>对应下面&#xff1a; 居中

【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

上两篇文章我们初步接触了ABI-应用程序二进制接口的概念&#xff0c;点击链接查看上一篇文章&#xff1a;【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二。了解了为什么会有ABI的存在。本篇文章继续学习ABI 的内容。学习在ABI规范下&#xff0c;函数栈帧的结构与函…

【转】电脑GPS导航软件下载,教你把笔记本做成GPS

在开始之前&#xff0c;先说一下&#xff0c;相信很多朋友在谷哥搜索“电脑GPS导航软件”时&#xff0c;都很难找到真正的下载地址&#xff0c;多数是只能下载到灵图的破解文件&#xff0c;那么&#xff0c;本文不同&#xff0c;本文不但教你怎么打造电脑GPS&#xff0c;而且提…

【软件开发底层知识修炼】二十四 ABI之函数调用约定

上一篇文章学习了Linux环境下的函数栈帧的形成与摧毁。点击链接查看相关文章&#xff1a;软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁本篇文章继续学习ABI接口相关的内容。函数调用约定 文章目录1 函数参数如何入栈&#xff0c;返回…

深入了解 Python 的 import 语句

在 Python 中&#xff0c;import 语句是一个关键的功能&#xff0c;用于在程序中引入模块和包。本文将深入讨论 import 语句的各种用法、注意事项以及一些高级技巧&#xff0c;以帮助你更好地理解和使用这一功能。 概念介绍 package 通常对应一个文件夹&#xff0c;下面可以有…

javascript 获取上一页的url

在js中&#xff0c;如果通过连接或者表单提交里&#xff0c;可以用以下三种方式获取上一页的url&#xff1a; 1、document.referrer 2、top.document.referrer 3、window.parent.document.referrer 这在ie和firefox里都可以实现 但如果在IE中用js函数跳转的话&#xff0c;以上三…

【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定

上一篇文章学习了几种函数调用约定的区别&#xff0c;点击链接查看上一篇文章&#xff1a;【软件开发底层知识修炼】二十四 ABI之函数调用约定本篇文章继续学习函数调用约定中&#xff0c;关于函数返回值的问题。当函数返回值为结构体时&#xff0c;函数返回值是如何来传给调用…

说说我最近比较迷的Criminal Minds

喜欢《犯罪心理》这部美剧很久了&#xff0c;从第四季一直到现在还在追的第六季&#xff0c;觉得集集精彩。简练而不失悬念。该片的一些情节上的特质让我总是与工作上的某些场景产生对比联想。管理模式。BAU是一个典型的家庭式的管理方式。Hotch作为大家长&#xff0c;不辞辛劳…

【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录

前面学习了ABI的知识&#xff0c;感觉受益良多。对底层与编译器有更加深刻的认识&#xff0c;为此这里将前面写过的关于ABI 的文章给列出来&#xff0c;方便学习与翻阅。 【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一【软件开发底层知识修炼】二十二 ABI-应用程序…

关于《高性能JavaScript》制表(Memoization)笔记

减少工作量是最好的性能优化技术。代码所做的事情越少&#xff0c;他的速度就越快。 书中在关于用制表优化递归的下一段代码中&#xff0c;存在问题。 function memfactorial(n){ if (!memfactorial.cache){ memfactorial.cache { "0": 1, …

CSDN-Markdown-图片设置(大小,居中)

利用markdown在编写文档时插入图片是默认靠左&#xff0c;有些时候将图片设置为居中时可以更加的美观&#xff0c;这时就需要在图片的信息前边添加如下程序 <div aligncenter>![这里写图片描述](http:...如果想将图片位于右侧&#xff0c;只需要将center改为right<di…

查询指定范围内数据记录(适用于sqlserver2005以上)

1 WITHOrderedOrders AS2 (SELECTROW_NUMBER()over(orderbyg_Id asc) asRowNumber,g_Id FROMguanxi) 3 SELECT*4 FROMOrderedOrders 5 WHERERowNumber BETWEEN50AND60;转载于:https://www.cnblogs.com/prolion/archive/2011/04/02/2003277.html

CSDN中markdown字体颜色,大小,首行缩进,居中排布

一、下面是首行缩进的两种方法 1.这里实用空格去替代缩进的字符&#xff0c;下面讲的替代包括分号 2.把输入法由半角改为全角。 两次空格之后就能够有两个汉字的缩进。 半方大的空白用&ensp;或 全方大的空白用&emsp;或 不断行的空白格用 或 示例&#xff1a; 略略略…

SQL查询中的转义字符

如果想查找“_cs”结尾的的账户select * from [user] where loginname like %_cs是不行的&#xff0c;_ 被认为是任意的字符&#xff0c;所以需要转义字符&#xff0c;有两种写法&#xff1a;select * from [user] where loginname like %[_]csselect * from [user] where logi…