Interoperabilitate cu Limbajul C: Apelarea Libc din Assembly x86_64 și Alinierea Stivei în Assembly (x86_64)

Ghid complet pentru interoperabilitatea x86_64 cu limbajul C: apelarea printf, puts, malloc și exit din bibliotecile dinamice, alinierea obligatorie a stivei RSP la 16 octeți și convenția de apel System V ABI.

Sintaxă
sub rsp, 8; call printf; add rsp, 8 ; aliniere obligatorie la 16 octeți

Scrierea în Assembly nu înseamnă izolarea de restul lumii software. În viața reală, majoritatea rutinelor critice de asamblare sunt legate împreună cu biblioteca standard C (libc) pentru a beneficia de funcții mature precum printf, malloc, memcpy sau sqrt.

Apelarea funcției printf din libc cu respectarea alinierii de 16 octeți a stivei
default rel

section .rodata
    format_text: db "Rezultatul calculului este: %ld (Hex: 0x%lX)", 10, 0

section .text
global main
extern printf
extern exit

main:
    ; REGULA DE AUR A ABI-ULUI SYSTEM V (Linux / macOS):
    ; La intrarea într-o funcție externă prin 'call', registrul RSP trebuie să fie ALINIAT LA 16 OCTEȚI.
    ; La intrarea în 'main', RSP este aliniat la 8 octeți (din cauza adresei de retur plasate de apelant).
    ; Prin urmare, scădem 8 octeți pentru a readuce stiva la multiplu de 16:
    sub     rsp, 8

    ; Conform System V AMD64 ABI:
    ; Primul argument (RDI) = format string
    ; Al doilea argument (RSI) = valoarea 1
    ; Al treilea argument (RDX) = valoarea 2
    lea     rdi, [format_text]
    mov     rsi, 42000
    mov     rdx, 42000

    ; Pentru funcții cu număr variabil de argumente (variadic) cum este printf,
    ; registrul AL trebuie să conțină numărul de registre vectoriale XMM folosite:
    xor     al, al              ; 0 argumente float / vectoriale

    call    printf              ; Apelăm funcția din biblioteca standard C!

    ; Readucem stiva la starea inițială:
    add     rsp, 8

    ; Returnăm 0 (succes):
    xor     eax, eax
    ret
Argument funcție C Registru x86_64 asociat Exemplu utilizare
Argument 1 RDI Format string, pointer destinație, prim parametru întreg
Argument 2 RSI Pointer sursă, al doilea parametru
Argument 3 RDX Dimensiune octeți, al treilea parametru
Argument 4 RCX Al patrulea parametru
Argument 5 R8 Al cincilea parametru
Argument 6 R9 Al șaselea parametru
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Interoperabilitate cu Limbajul C: Apelarea Libc din Assembly x86_64 și Alinierea Stivei

Ai o nelămurire despre utilizarea comenzii Interoperabilitate cu Limbajul C: Apelarea Libc din Assembly x86_64 și Alinierea Stivei sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.