ASM

Învață Assembly (x86_64): comenzi explicate cu exemple

66 de comenzi 28 de categorii Comunitate & Q&A

Limbajul de Asamblare (Assembly x86_64) este reprezentarea textuală directă, de cel mai jos nivel, a codului mașină executat nativ de microprocesoarele moderne Intel și AMD pe 64 de biți. Spre deosebire de limbajele de nivel înalt (precum C, Rust sau Go) care abstractizează componentele hardware, în Assembly programatorul controlează în mod direct fiecare registru fizic, calculează adresele exacte de memorie, gestionează stiva de execuție la nivel de octet și comunică fără intermediari cu nucleul sistemului de operare prin instrucțiunea syscall.

Anatomia unei Instrucțiuni x86_64 (Sintaxa Intel)
# În sintaxa standard Intel (folosită de NASM, MASM și editoarele moderne):
# FORMAT: [instrucțiune] [destinație], [sursă]

mov rax, 42                     # Încarcă valoarea literală 42 în registrul RAX pe 64 de biți
mov rbx, rax                    # Copiază valoarea din RAX în registrul RBX
add rax, 10                     # Calculează RAX = RAX + 10 (rezultat: 52)
mov qword [rbp - 8], rax        # Salvează valoarea din RAX în stivă la adresa memoriei locale

De ce învățăm și folosim Assembly în ingineria software modernă?

Deși marea majoritate a aplicațiilor moderne sunt scrise în limbaje compilate moderne, stăpânirea Assembly x86_64 este o competență elitistă esențială în cinci domenii critice:

  • Securitate Cibernetică și Reverse Engineering: Analiza fișierelor malware, decompilarea binarilor în Ghidra sau IDA Pro și exploatarea vulnerabilităților de memorie (Buffer Overflow, Return-Oriented Programming – ROP).
  • Dezvoltarea Sistemelor de Operare și Drivere: Faza de bootstrap (pornirea procesorului în Real Mode și comutarea în Long Mode 64-bit), comutarea contextului de proces (Context Switch) și configurarea tabelelor de paginare MMU.
  • Optimizări Extreme de Performanță: Implementarea nucleelor matematice criptografice și grafice folosind extensii vectoriale SIMD (AVX-512, SSE).
  • Depanare de Nivel Jos (Low-Level Debugging): Inspectarea prăbușirilor de memorie (Segfaults / Core Dumps) în gdb și lldb la nivel de registre hardware.
  • Arhitectura Compilatoarelor: Înțelegerea profundă a codului emis de backend-ul LLVM sau GCC pentru a scrie cod C++/Rust mult mai eficient și prietenos cu cache-ul procesorului.
Convenția de Sintaxă: Acest ghid utilizează sintaxa Intel cu asamblorul open-source de referință NASM (Netwide Assembler) pe sistemul de operare Linux (System V AMD64 ABI), aceasta fiind convenția dominantă în industrie.

Mai jos găsești cele 12 ghiduri fundamentale organizate metodic: de la organizarea registrelor și operațiunile fundamentale pe memorie, până la stivă, funcții, convenții de apel și primul tău program complet compilat fără biblioteci externe.

Aritmetică Avansată 2 comenzi

Vectori SIMD și SSE/AVX 8 comenzi

Arhitectură Hardware 6 comenzi

Sincronizare și Atomicitate 4 comenzi

Operații pe Biți 4 comenzi

Operații pe Șiruri 3 comenzi

Gestiunea Memoriei și Cache 2 comenzi

Directive NASM și Simboluri 3 comenzi

Gestiunea Stivei și Funcții 2 comenzi

Instrucțiuni de Sistem 5 comenzi

Instrucțiuni Fundamentale 3 comenzi

Controlul Fluxului 2 comenzi

Transfer de Date 3 comenzi

Arhitectură & Registre 1 comandă

Instrucțiuni de Bază & Memorie 2 comenzi

Aritmetică & Logică 2 comenzi

Controlul Fluxului & Salturi 2 comenzi

Stivă & Subrutine 2 comenzi

Arhitectură & Interoperabilitate 1 comandă

Sistem de Operare & Kernel 1 comandă

Unelte & Compilare 1 comandă

Instrucțiuni de Control 1 comandă

Operații Logice și Booleene 1 comandă

Operații de Memorie 1 comandă

Arhitectură și SIMD 1 comandă

Structura Programului 1 comandă

Adresare și Securitate 1 comandă

Interoperabilitate și Sistem 1 comandă

Toate instrucțiunile, registrele și directivele Assembly x86_64

Referința completă a celor 66 de concepte, instrucțiuni fundamentale, moduri de adresare, registre vectoriale SIMD (SSE/AVX), mecanisme de sincronizare hardware și directive NASM acoperite în acest ghid exhaustiv. Fiecare instrucțiune dispune de o pagină dedicată cu explicații de nivel scăzut în limba română, sintaxă exactă și exemple practice gata de asamblat.

Registre Hardware și Instrucțiuni Fundamentale (7)

Instrucțiune / Concept Descriere
Registre Generale x86_64 Arhitectura registrelor pe 64 de biți (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, R8-R15)
Registrul RFLAGS Semnificația și analiza flag-urilor de stare hardware (CF, ZF, SF, OF, DF, IF)
LAHF & SAHF Încărcarea și salvarea rapidă a flag-urilor de stare în registrul AH
NOP & PAUSE Instrucțiuni fără operație, alinierea codului și optimizarea energetică a spinlock-urilor
CPUID Interogarea microprocesorului pentru capabilități hardware, model și extensii
RDTSC & RDTSCP Măsurarea ciclurilor reale de ceas ale procesorului pentru micro-benchmarking
Octeții ModR/M & SIB Mecanismul intern binar de codificare a adresării hardware pe x86_64

Transfer de Date și Conversii (6)

Instrucțiune / Concept Descriere
MOV & Moduri de Adresare Copierea datelor între registre și memorie folosind deplasamente și indici
LEA (Load Effective Address) Calcul rapid de adrese și aritmetică compusă fără modificarea flag-urilor
MOVZX & MOVSX / MOVSXD Conversii între tipuri cu lățimi diferite prin extindere de zero sau de semn
XCHG Schimbul reciproc de valori între registre/memorie cu blocare hardware implicită
CMOVcc Transfer condiționat de date bazat pe flag-uri eliminând ramificările lente
XLATB Translatare ultra-rapidă prin tabele indexate în memorie (Look-Up Tables)

Aritmetică, Înmulțire și Precizie Multiplă (8)

Instrucțiune / Concept Descriere
ADD, SUB, INC, DEC, NEG Operațiuni aritmetice de bază pe numere întregi și complement față de doi
MUL, IMUL, DIV, IDIV Înmulțire și împărțire cu semn și fără semn pe 64/128 de biți
ADC & SBB Adunare și scădere cu Carry pentru calcule pe 128 de biți și numere gigantice
CDQE, CDQ & CQO Extinderea semnului acumulatorului în perechi de registre înainte de IDIV
CLC, STC & CMC Manipularea directă a bitului Carry Flag pentru semnalizarea erorilor
CMP & TEST Scădere și operație AND virtuală pentru setarea flag-urilor de stare
SETcc Setarea octeților booleeni (0 sau 1) pe baza condițiilor din flag-uri
BSWAP Inversarea ordinii octeților pentru conversia Little-Endian în Big-Endian de rețea

Operații Logice, Manipulare Biți și Flag-uri (3)

Instrucțiune / Concept Descriere
AND, OR, XOR, NOT, SHL, SHR Algebră booleană pe biți, shiftări logice și măști binare
SAR, ROL & ROR Deplasare aritmetică cu păstrarea semnului și rotații circulare de biți
BT, BTS, BTR, BSF, BSR Testarea, setarea, resetarea și scanarea poziției primului bit nenul

Controlul Fluxului și Bucle (3)

Instrucțiune / Concept Descriere
JMP & Salturi Condiționate Ramificarea fluxului prin JMP, JE, JNE, JG, JL, JA, JB și predicția de salturi
LOOP, LOOPE & LOOPNE Bucle hardware automate bazate pe decrementarea contorului RCX
Salturi Indirecte & Jump Tables Implementarea structurilor switch-case prin tabele indexate de adrese

Gestiunea Stivei, Proceduri și ABI (6)

Instrucțiune / Concept Descriere
PUSH & POP (Stiva Hardware) Gestiunea memoriei LIFO, registrul RSP și salvarea stărilor temporare
CALL & RET Apelarea procedurilor, salvarea adresei de retur și cadrul de stivă RBP
ENTER & LEAVE Alocarea și demontarea automată a cadrului de stivă pentru variabile locale
PUSHFQ & POPFQ Salvarea și restaurarea completă a tuturor flag-urilor pe stivă
System V AMD64 ABI Regulile de transmitere a argumentelor prin registre (RDI, RSI, RDX, RCX, R8, R9)
Interoperabilitate C & Libc Apelarea printf/malloc din Assembly și constrângerea de aliniere la 16 octeți

Operații pe Șiruri și Blocuri de Memorie (5)

Instrucțiune / Concept Descriere
MOVSB, STOSB & Prefixul REP Copierea și umplerea blocurilor masive de memorie (memcpy și memset nativ)
SCAS & CMPS (Căutare & Comparare) Scanarea și compararea șirurilor de memorie cu REPE și REPNE
LODS (LODSB, LODSW, LODSD, LODSQ) Încărcarea automată a elementelor secvențiale în acumulator
CLD & STD Controlul direcției de procesare a memoriei (DF=0 crescător, DF=1 descrescător)
RIP-Relative Addressing & PIE Generarea de cod poziție-independent pentru executabile moderne protejate

Paralelism SIMD (SSE, AVX) și FPU (10)

Instrucțiune / Concept Descriere
Registre SIMD (XMM, YMM) Arhitectura vectorilor pe 128 și 256 de biți pentru paralelism masiv de date
MOVAPS & MOVUPS Transferul vectorilor aliniați strict la 16 octeți vs transferul nealiniat
ADDPS, SUBPS, MULPS, DIVPS Calcule matematice paralele pe 4 numere float simultan într-un singur pas
ADDPD & MULPD Operațiuni vectoriale paralele pe numere reale de precizie dublă (double)
SQRTPS & RSQRTPS Rădăcină pătrată exactă și aproximarea ultra-rapidă a inversei vectoriale
PADDB, PADDW, PADDD, PADDQ Aritmetică paralelă pe numere întregi și operațiuni cu saturație
PCMPEQB & PCMPGTB Comparații paralele pe octeți pentru accelerarea masivă a parserelor
PMOVMSKB Extragerea biților de semn din vectori într-un număr întreg pentru căutări rapide
AVX VEX (Sintaxa cu 3 Operanzi) Instrucțiuni non-distructive pe 256 de biți și directiva VZEROUPPER
Arhitectura Legacy x87 FPU Stiva de 8 registre pe 80 de biți ST(0)-ST(7) și instrucțiunile FLD/FSTP

Arhitectură Sistem, Sincronizare, Cache și Asamblare (18)

Instrucțiune / Concept Descriere
SYSCALL (Linux Kernel) Apeluri de sistem directe fără biblioteci externe (read, write, open, exit)
CMPXCHG (Compare-and-Swap) Primitiva atomică hardware fundamentală pentru algoritmi lock-free
XADD (Fetch-and-Add) Schimb și adunare atomică pentru contoare și structuri paralele
Prefixul LOCK Blocarea magistralei și garantarea coerenței cache-ului în multiprocesare
Bariere de Memorie (MFENCE, LFENCE, SFENCE) Controlul ordinii de scriere/citire împotriva execuției speculative nesigure
CLFLUSH & CLFLUSHOPT Evacuarea și scrierea forțată a liniilor de cache în memoria principală RAM
PREFETCH (T0, NTA) Preîncărcarea asincronă a datelor în nivelurile de cache L1-L3
INT3 & Întreruperi Software Puncte de oprire hardware dedicate mediilor de depanare GDB/LLDB
Secțiuni (.text, .data, .rodata, .bss) Organizarea memoriei executabilului conform standardului ELF64
Directive NASM: EQU, %define, %macro Preprocesare avansată, constante simbolice și șabloane de cod macro
Directiva NASM: TIMES Alocarea repetitivă de buffer-e și padding exact de octeți
Structuri NASM: STRUC & RESB Definirea structurilor de date compuse cu calcul automat de offset
Compilare & Linkare (NASM & LD) Construirea fișierelor obiect și a executabilelor ELF pe 64 de biți
HLT (Suspendare Procesor) Instrucțiune de Ring 0 pentru oprirea consumului CPU până la întreruperi
RDMSR & WRMSR Accesarea registrelor specifice modelului pentru configurarea nucleului
Registre de Control (CR0, CR3, CR4) Activarea memoriei paginate și a Modului Long pe 64 de biți
LGDT & LIDT (GDT / IDT) Inițializarea descriptorilor de segmente de memorie și a tabelei de întreruperi
Porturi I/O: IN & OUT Comunicarea directă cu perifericele plăcii de bază pe spațiul I/O x86
Comunitate & Schimb de cunoștințe

Discuții, Întrebări & Coduri Assembly (x86_64)

Ai o întrebare legată de Assembly (x86_64), cauți o soluție sau vrei să împărtășești un fragment util de cod? Trimite mai jos contribuția ta.

💬

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.