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 |
Întrebări & Exemple de Cod:
Interoperabilitate cu Limbajul C: Apelarea Libc din Assembly x86_64 și Alinierea StiveiAi o nelămurire despre utilizarea comenzii
Interoperabilitate cu Limbajul C: Apelarea Libc din Assembly x86_64 și Alinierea Stiveisau 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.