[英]Purpose of rdi register for no argument function
考慮這個簡單的函數:
struct Foo {
int a;
int b;
int c;
int d;
int e;
int f;
};
Foo foo() {
Foo f;
f.a = 1;
f.b = 2;
f.c = 3;
f.d = 4;
f.e = 5;
f.f = 6;
return f;
}
它生成以下程序集:
0000000000400500 <foo()>:
400500: 48 ba 01 00 00 00 02 movabs rdx,0x200000001
400507: 00 00 00
40050a: 48 b9 03 00 00 00 04 movabs rcx,0x400000003
400511: 00 00 00
400514: 48 be 05 00 00 00 06 movabs rsi,0x600000005
40051b: 00 00 00
40051e: 48 89 17 mov QWORD PTR [rdi],rdx
400521: 48 89 4f 08 mov QWORD PTR [rdi+0x8],rcx
400525: 48 89 77 10 mov QWORD PTR [rdi+0x10],rsi
400529: 48 89 f8 mov rax,rdi
40052c: c3 ret
40052d: 0f 1f 00 nop DWORD PTR [rax]
根據程序集,我知道調用者在其堆棧上為Foo
創建了空間,並將該信息在rdi
傳遞給被調用者。
我正在嘗試查找此約定的文檔。 linux 中的調用約定規定rdi
包含第一個整數參數。 在這種情況下, foo
沒有任何參數。
此外,如果我讓foo
接受一個整數參數,它現在作為rsi
(注冊第二個參數)傳遞,rdi 用於返回對象的地址。
任何人都可以提供有關如何在系統 V ABI 中使用rdi
一些文檔和說明嗎?
請參閱ABI 文檔中的第3.2.3節參數傳遞,其中說:
如果類型具有 MEMORY 類,則調用者為返回值提供空間並在 %rdi 中傳遞此存儲的地址,就好像它是函數的第一個參數一樣。 實際上,這個地址變成了“隱藏的”第一個參數。
返回時 %rax 將包含調用者在 %rdi 中傳入的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.