Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 · Pelajaran

Memanggil Himpunan daripada C

Pelajari cara menyepadukan rutin himpunan ke dalam projek C/C++, menghantar parameter dan menerima nilai pulangan menggunakan konvensyen panggilan.

Pelajaran 1 daripada 411 langkah

Memanggil Himpunan daripada C ialah pelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 merangkumi sejumlah 4 pelajaran.

Mengapa C Memerlukan Bahasa Himpunan

Mengapa anda hendak mencampurkan C/C++ dengan bahasa himpunan? Walaupun mungkin kelihatan ketinggalan zaman, terdapat sebab yang kukuh!

  • Prestasi: Untuk bahagian kod yang kritikal, bahasa himpunan yang dioptimumkan secara manual boleh menjadi lebih pantas daripada kod yang dijana oleh pengkompil.
  • Akses Perkakasan: Berinteraksi secara langsung dengan ciri perkakasan yang tidak didedahkan oleh C/C++.
  • Arahan Khusus: Gunakan arahan CPU khas (contohnya, untuk kriptografi atau multimedia) secara langsung.
  • Kod Legasi: Sepadukan rutin bahasa himpunan atau komponen sistem pengendalian sedia ada.

Ini membolehkan anda mendapatkan "yang terbaik daripada kedua-dua dunia" – struktur aras tinggi C bersama kuasa aras rendah bahasa himpunan.

Kontrak Panggilan

Apabila C memanggil fungsi bahasa himpunan, kedua-duanya perlu bersetuju tentang "kontrak" cara segala-galanya berfungsi. Kontrak ini dipanggil konvensyen panggilan.

Kontrak ini mentakrifkan:

  • Cara argumen dihantar (daftar atau timbunan).
  • Pihak yang membersihkan timbunan selepas panggilan.
  • Daftar yang perlu dikekalkan oleh fungsi yang dipanggil.

Untuk sistem Linux/macOS 64-bit moden, System V AMD64 ABI ialah piawaian. Kita akan menumpukan pada perkara ini.

Antara Muka Awam Bahasa Himpunan

Untuk menjadikan fungsi bahasa himpunan boleh dipanggil daripada C, anda perlu mengisytiharkannya sebagai global. Ini memberitahu pemaut bahawa fungsi tersebut boleh diakses daripada fail lain.

Struktur asasnya kelihatan seperti ini:

  • Gunakan arahan global.
  • Takrifkan fungsi anda dengan label (sering diawali dengan garis bawah, seperti _my_function, walaupun perkara ini tidak diwajibkan oleh System V ABI dan merupakan amalan umum).
  • Sertakan arahan bahasa himpunan anda.
  • Akhiri dengan arahan ret untuk mengembalikan kawalan kepada pemanggil.
section .text
global _my_function
_my_function:
    ; Your assembly code here
    ret

Pandangan C terhadap Bahasa Himpunan

Dari sisi C, fungsi bahasa himpunan sama seperti mana-mana fungsi lain yang ditakrifkan di tempat lain. Anda mengisytiharkannya menggunakan kata kunci extern.

Prototaip fungsi dalam C mesti sepadan tepat dengan perkara yang dijangkakan oleh fungsi bahasa himpunan dari segi argumen dan jenis kembali.

Sebagai contoh, jika fungsi bahasa himpunan anda mengambil dua integer long dan mengembalikan long, prototaip C anda ialah: extern long my_assembly_func(long a, long b);

extern long my_assembly_func(long a, long b);

Menghantar Data kepada Bahasa Himpunan

Di bawah System V AMD64 ABI, enam argumen integer atau penuding pertama dihantar melalui daftar tertentu:

  • Argumen pertama: RDI
  • Argumen kedua: RSI
  • Argumen ketiga: RDX
  • Argumen keempat: RCX
  • Argumen kelima: R8
  • Argumen keenam: R9

Sebarang argumen tambahan ditolak ke dalam timbunan dari kanan ke kiri.

Mendapatkan Hasil Kembali

Apabila fungsi bahasa himpunan anda selesai, fungsi tersebut meletakkan nilai kembalinya ke dalam daftar tertentu supaya C boleh mendapatkannya.

  • Untuk nilai kembali integer atau penuding, gunakan daftar RAX.
  • Untuk nilai titik apung, gunakan daftar XMM0.

Selepas meletakkan hasil, fungsi bahasa himpunan hanya melaksanakan ret untuk kembali ke kod C yang memanggilnya.

Tambah Nombor: C Memanggil Bahasa Himpunan (ASM)

Mari cipta fungsi bahasa himpunan untuk menambah dua nombor. Fail ini biasanya dinamakan my_add.asm.

Berikan perhatian kepada cara argumen diterima dalam RDI dan RSI, manakala hasil diletakkan dalam RAX.

; my_add.asm
section .text
global add_two_numbers

add_two_numbers:
    ; RDI holds the first argument (a)
    ; RSI holds the second argument (b)
    mov rax, rdi    ; Move 'a' into RAX
    add rax, rsi    ; Add 'b' to RAX (RAX = a + b)
    ret             ; Return to caller (RAX holds the result)

Tambah Nombor: C Memanggil Bahasa Himpunan (C)

Sekarang, mari tulis kod C yang menggunakan fungsi bahasa himpunan kita. Fail ini biasanya dinamakan main.c. Ingat untuk mengisytiharkannya dengan extern.

Untuk mengompil dan memaut:

nasm -f elf64 my_add.asm -o my_add.o

gcc main.c my_add.o -o my_program

./my_program

// main.c
#include <stdio.h>

// Declare the assembly function
extern long add_two_numbers(long a, long b);

int main() {
    long num1 = 10;
    long num2 = 25;
    long sum;

    // Call the assembly function
    sum = add_two_numbers(num1, num2);

    printf("The sum of %ld and %ld is %ld\n", num1, num2, sum);

    return 0;
}

Melindungi Daftar

Apabila fungsi bahasa himpunan anda berjalan, fungsi tersebut mungkin menggunakan pelbagai daftar. Sesetengah daftar ialah caller-saved (pemanggil mesti menyimpannya jika diperlukan kemudian), manakala yang lain ialah callee-saved (fungsi bahasa himpunan mesti menyimpan dan memulihkannya jika mengubahnya).

Daftar callee-saved yang biasa (x64): RBX, RBP, RSP, R12, R13, R14, R15.

Jika fungsi bahasa himpunan anda mengubah daftar callee-saved, anda mesti PUSH nilainya pada permulaan dan POP semula sebelum kembali.

_my_function_with_preservation:
    push rbx      ; Save RBX
    ; ... use RBX ...
    pop rbx       ; Restore RBX
    ret

Semakan Pantas

Berdasarkan System V AMD64 ABI, daftar manakah yang biasanya menyimpan argumen integer ketiga yang dihantar daripada C kepada fungsi bahasa himpunan?

Ulang Kaji: Menghubungkan C dan Bahasa Himpunan

Syabas! Anda telah mempelajari asas memanggil kod bahasa himpunan daripada C.

  • Kita memahami mengapa C dan bahasa himpunan dipautkan.
  • Kita meneroka konvensyen panggilan, dengan tumpuan pada System V AMD64 ABI.
  • Anda melihat cara mengisytiharkan fungsi pada sisi bahasa himpunan dan sisi C.
  • Anda mempelajari cara argumen dihantar (melalui daftar) dan nilai kembali diterima (RAX).
  • Kita menyentuh peraturan pengekalan daftar untuk mengelakkan kesan sampingan yang tidak dijangka.

Kemahiran ini penting untuk pengoptimuman aras rendah dan interaksi dengan sistem!

Percuma untuk bermula

Pelajari Assembly dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Memanggil Himpunan daripada C” percuma?

Ya — teks penuh “Memanggil Himpunan daripada C” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86, tingkat taraf kepada CoddyKit PRO. Kursus Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Memanggil Himpunan daripada C”?

Pelajari cara menyepadukan rutin himpunan ke dalam projek C/C++, menghantar parameter dan menerima nilai pulangan menggunakan konvensyen panggilan. Anda berlatih Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Memanggil Himpunan daripada C” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 ini?

Ya. Setiap pelajaran Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86 menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Memanggil Himpunan daripada C
  2. Memanggil C daripada Himpunan
  3. Teknik Pengaturcaraan Berbilang Bahasa
  4. Konvensyen Panggilan: cdecl, stdcall dan System V
← Kembali ke Bahasa Himpunan & Pengaturcaraan Sistem Aras Rendah x86