簡體   English   中英

rdi 寄存器用於無參數函數的目的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM