GNU/Linux >> Belajar Linux >  >> Linux

Register apa yang dipertahankan melalui panggilan fungsi linux x86-64

Berikut tabel register lengkap dan penggunaannya dari dokumentasi [PDF Link]:

r12 , r13 , r14 , r15 , rbx , rsp , rbp adalah register yang disimpan oleh penerima - mereka memiliki "Ya" di kolom "Diawetkan di seluruh panggilan fungsi".


Pendekatan eksperimental:membongkar kode GCC

Sebagian besar untuk bersenang-senang, tetapi juga sebagai verifikasi cepat bahwa Anda memahami ABI dengan benar.

Mari kita coba untuk menghancurkan semua register dengan rakitan inline untuk memaksa GCC menyimpan dan memulihkannya:

main.c

#include <inttypes.h>

uint64_t inc(uint64_t i) {
    __asm__ __volatile__(
        ""
        : "+m" (i)
        :
        : "rax",
          "rbx",
          "rcx",
          "rdx",
          "rsi",
          "rdi",
          "rbp",
          "rsp",
          "r8",
          "r9",
          "r10",
          "r11",
          "r12",
          "r13",
          "r14",
          "r15",
          "ymm0",
          "ymm1",
          "ymm2",
          "ymm3",
          "ymm4",
          "ymm5",
          "ymm6",
          "ymm7",
          "ymm8",
          "ymm9",
          "ymm10",
          "ymm11",
          "ymm12",
          "ymm13",
          "ymm14",
          "ymm15"
    );
    return i + 1;
}

int main(int argc, char **argv) {
    (void)argv;
    return inc(argc);
}

GitHub upstream.

Kompilasi dan bongkar:

 gcc -std=gnu99 -O3 -ggdb3 -Wall -Wextra -pedantic -o main.out main.c
 objdump -d main.out

Pembongkaran berisi:

00000000000011a0 <inc>:
    11a0:       55                      push   %rbp
    11a1:       48 89 e5                mov    %rsp,%rbp
    11a4:       41 57                   push   %r15
    11a6:       41 56                   push   %r14
    11a8:       41 55                   push   %r13
    11aa:       41 54                   push   %r12
    11ac:       53                      push   %rbx
    11ad:       48 83 ec 08             sub    $0x8,%rsp
    11b1:       48 89 7d d0             mov    %rdi,-0x30(%rbp)
    11b5:       48 8b 45 d0             mov    -0x30(%rbp),%rax
    11b9:       48 8d 65 d8             lea    -0x28(%rbp),%rsp
    11bd:       5b                      pop    %rbx
    11be:       41 5c                   pop    %r12
    11c0:       48 83 c0 01             add    $0x1,%rax
    11c4:       41 5d                   pop    %r13
    11c6:       41 5e                   pop    %r14
    11c8:       41 5f                   pop    %r15
    11ca:       5d                      pop    %rbp
    11cb:       c3                      retq   
    11cc:       0f 1f 40 00             nopl   0x0(%rax)

jadi kami melihat dengan jelas bahwa yang berikut ini didorong dan dimunculkan:

rbx
r12
r13
r14
r15
rbp

Satu-satunya yang hilang dari spesifikasi adalah rsp , tetapi tentu saja kami berharap tumpukan dipulihkan. Pembacaan rakitan yang cermat menegaskan bahwa rakitan tersebut dipertahankan dalam hal ini:

  • sub $0x8, %rsp :mengalokasikan 8 byte pada stack untuk menyimpan %rdi di %rdi, -0x30(%rbp) , yang dilakukan untuk perakitan inline +m kendala
  • lea -0x28(%rbp), %rsp memulihkan %rsp kembali ke sebelum sub , yaitu 5 munculan setelah mov %rsp, %rbp
  • ada 6 dorongan dan 6 letupan yang sesuai
  • tidak ada instruksi lain yang menyentuh %rsp

Diuji di Ubuntu 18.10, GCC 8.2.0.


Linux
  1. Apa Itu Halaman Kotor di Linux

  2. Apa itu Kode Keluar Bash di Linux

  3. Apa itu file jarang di Linux

  1. Apa kerugian dari antrian pesan Linux?

  2. Memanggil fungsi userspace dari dalam modul kernel Linux

  3. Apa sebenarnya header kernel Linux itu?

  1. Linux – Apa Cara Berbeda Untuk Mengatur Izin File Dll Di Gnu/linux?

  2. Apa saja Jenis Shell yang Berbeda di Linux?

  3. UNIX / Linux :Apa itu Shell? Apa Shells yang berbeda?