2015-09-27 79 views
-3

的我很迷茫之間的API (應用編程接口)和ABI(應用程序二進制接口)可以解釋人我什麼是這兩個和他們的區別的概念?概念API和ABI

+1

調查維基百科,並回來一個具體的問題。 –

回答

1

API在源代碼級別定義模塊可以爲客戶提供的對象和方法。你如何實例化它的對象?你需要傳遞什麼論據給它的方法,它們返回什麼?一般來說,當你想知道什麼庫函數可用以及如何使用它們時,你在問一個API。

ABI是一個較低級別的概念。它定義了模塊和客戶端之間傳遞的位和字節。他們在什麼格式?他們是否被推入堆棧,通過寄存器,或存儲在其他地方?函數返回時是否需要清理堆棧,如果有,誰負責處理呢?

完全愚蠢,但啓發性的例子:

考慮一個庫函數兩個整數相乘:

long long multiply(unsigned int multiplicand, long multiplier); 

它的API指定您有兩個參數(一個無符號整數和有符號長叫它整數),並返回一個帶符號的雙精度長整數。

其ABI可以指定你使用這樣的:

  • 推棧上的返回地址作爲一個絕對的64位地址,在MSB到LSB順序。該功能完成後,該程序將繼續在該地址執行。
  • 以MSB到LSB的順序將32位值壓入堆棧。它表示無符號被乘數。
  • 在累加器寄存器中存儲64位值,按MSB至LSB順序存儲。它代表了二進制補碼形式的帶符號乘法器。
  • 跳轉到相對於程序開頭的地址0xADDADD來執行該功能。
  • 完成後,取堆棧中的前4個字節,並在累加器寄存器中追加值的前4個字節,以1的補碼格式以LSB到MSB的順序創建帶符號的64位乘積。調用者必須從堆棧中移除4個字節,以及4個字節的被乘數和8個字節的返回地址,以恢復堆棧。

Protip:如果我是你,我會找到另一個數學庫。這個太可怕了! :-)