asm în C++

Inserează instrucțiuni în limbaj de asamblare direct în codul C++; sintaxa și instrucțiunile depind de compilator și de procesor.

Sintaxă
asm("instrucțiuni în limbaj de asamblare");

Ce face asm

asm (assembler) îți permite să scrii instrucțiuni de procesor direct în codul C++. Standardul spune doar că asm("...") există; ce scrii înăuntru și cum funcționează depinde complet de compilator și de procesor.

Este folosit foarte rar: în nucleul sistemelor de operare, în drivere sau pentru instrucțiuni speciale pe care compilatorul nu le generează singur. Codul cu asm nu este portabil: instrucțiunile pentru un procesor ARM (Apple M, telefoane) nu merg pe un procesor x86 (Intel, AMD) și invers. Visual C++ pe 64 de biți nu acceptă deloc asm în cod.

Exemple

Exemplul 1: O instrucțiune care nu face nimic

nop („no operation”) există pe aproape toate procesoarele și nu face nimic. Programul doar arată că instrucțiunea s-a executat fără eroare.

#include <print>

int main() {
    asm("nop");
    std::println("Instrucțiunea nop a fost executată.");
}

Rezultat

Instrucțiunea nop a fost executată.

Exemplul 2: Adunare scrisă în asamblare (doar ARM64)

Forma cu : (operanzi de ieșire și de intrare) este o extensie GCC/clang. Instrucțiunea add de mai jos există doar pe procesoare ARM pe 64 de biți, ca Apple M; exemplul a rulat pe un astfel de procesor.

#include <print>

int main() {
    long a = 40, b = 2, suma = 0;
    asm("add %0, %1, %2" : "=r"(suma) : "r"(a), "r"(b));
    std::println("40 + 2 = {}", suma);
}

Rezultat

40 + 2 = 42

Greșeli frecvente

  • Copiezi cod asm de pe internet scris pentru alt procesor. Instrucțiunile x86 (mov eax, ...) nu se compilează pe ARM și invers.
  • Folosești asm „pentru viteză”. Compilatoarele moderne generează de obicei cod mai bun decât asamblarea scrisă de mână și nu pot optimiza în jurul blocului asm.

Comenzi înrudite

  • volatile: Spune compilatorului că valoarea se poate schimba din afara programului, deci fiecare citire și scriere trebuie făcută efectiv.
  • extern: Declară o variabilă sau funcție definită în altă parte (de obicei în alt fișier) sau cere legare în stilul limbajului C.