【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二
- 上一篇文章學(xué)習(xí)了ABI的相關(guān)內(nèi)容,具體最后分析了不同ABI下結(jié)構(gòu)體的對齊方式的不同。點(diǎn)擊鏈接查看上一篇文章:【軟件開發(fā)底層知識修煉】二十一 ABI-應(yīng)用程序二進(jìn)制接口一
- 本篇文章繼續(xù)學(xué)習(xí)ABI相關(guān)內(nèi)容。是上一篇文章的補(bǔ)充,如果沒有看過上一篇文章,一定要看上一篇文章。
文章目錄
- 1 ABI定義了硬件寄存器的作用
- 2 ABI下的函數(shù)調(diào)用約定
- 3 總結(jié)
1 ABI定義了硬件寄存器的作用
我們熟悉的寄存器的作用,沒想到也是ABI規(guī)范中的一員!!!
-
寄存器,是處理器用來存儲數(shù)據(jù)和運(yùn)行程序的重要載體。
-
一些寄存器在處理器設(shè)計好的時候,它們的功能就已經(jīng)確定好了的。
下面簡單介紹幾種寄存器的功能:
- EIP (指令指針寄存器):始終指向處理器下一條要執(zhí)行的指令
- ESP (棧頂指針寄存器):指向當(dāng)前運(yùn)行棧的棧頂
- EBP (棧幀基址寄存器):指向函數(shù)棧幀基址,用于定位運(yùn)行棧中的其他參數(shù)的
向以上的寄存器都是特定用處的寄存器。下面的是X86平臺下的通用寄存器的作用:
- 不管它是通用寄存器還是特定寄存器,實(shí)際上都是由ABI規(guī)范規(guī)定的。
除了X86平臺的寄存器規(guī)范,下面還列出了PowerPC寄存器的ABI規(guī)范:
2 ABI下的函數(shù)調(diào)用約定
函數(shù)調(diào)用我們很清楚是怎么回事。但是函數(shù)發(fā)生調(diào)用時,背地里可是發(fā)生了不少事。
發(fā)生了那么多事我們現(xiàn)在只關(guān)心兩件事:
當(dāng)函數(shù)發(fā)生調(diào)用時:
- 參數(shù)會傳遞給被調(diào)用的函數(shù)。這里面參數(shù)肯定是被送到了被調(diào)用函數(shù)的運(yùn)行棧中。這里面就有一個問題!!!參數(shù)如何傳遞?是從右向左的送給運(yùn)行棧中,還是從左向右?畢竟函數(shù)往往都有多余一個的參數(shù),我們不得不考慮這個問題。
- 當(dāng)函數(shù)調(diào)用結(jié)束后,會返回到之前的函數(shù)。那么剛剛被調(diào)用函數(shù)所使用棧由誰來清理?是由被調(diào)用的函數(shù)自己清理?還是由之前的調(diào)用函數(shù)來清理?
以上問題,雖然在編程中,我們并沒有去關(guān)注,但是理解它總沒有壞處的。
以上問題,我們熟知的一種ABI規(guī)范,也是大多數(shù)平臺的ABI規(guī)范:函數(shù)調(diào)用時參數(shù)是從又往左入棧的。由被調(diào)用函數(shù)來負(fù)責(zé)清理棧。
感覺上是我們不會用到ABI的規(guī)范。但是如果你是一個庫開發(fā)者,就需要對這個有所了解了。
比如下面的圖示:
- 如果A編譯器與B編譯器所遵循的ABI規(guī)范不一致,那么久無法工作。
3 總結(jié)
- ABI定義了硬件寄存器的只用方式
- ABI定義了函數(shù)調(diào)用時需要遵守的調(diào)用約定。
歡迎加我好友共同探討學(xué)習(xí)交流各種技術(shù)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Linux下安装GmSSL
- 下一篇: halcon/c++接口基础 之 hal