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
asmde 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 bloculuiasm.