![](/img/trans.png)
[英]Why does the caller have to clear the stack in the cdecl calling convention?
[英]Why is there a calling convention for arrays?
我正在閱讀System V應用程序二進制接口 ,有一部分是我無法理解的。
首先,該文件指出
沒有嘗試為C以外的語言指定ABI
(第10頁)。
稍后,在第20頁,數組分為MEMORY,POINTER等:
聚合(結構和數組)和聯合類型的分類如下:
...
然后使用分類來定義調用約定 - 它們的值和邊界如何傳遞給函數並從函數返回。 如果我正確讀取算法,則可以將數組分類為INTEGER,MEMORY或SSE。
但是在C語言中,數組總是作為指針傳遞和返回。 那么為什么對數組進行分類以及在哪種情況下數組類很重要呢?
我想通了:如果數組是結構或聯合的一部分,它可以在寄存器中傳遞。
這個C代碼
#include <stdint.h>
struct somebytes {
uint8_t bytes[8];
};
uint8_t plus(struct somebytes p) {
return p.bytes[3]+p.bytes[5];
}
轉換為此程序集:
mov %rdi,%rax
shr $0x28,%rdi
shr $0x18,%rax
add %edi,%eax
retq
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.