A volte indicato come assembly o ASM, un linguaggio assembly è un linguaggio di programmazione di basso livello.
I programmi scritti in lingue assembly sono compilati da un assemblatore. Ogni assemblatore ha il proprio linguaggio di assemblaggio, progettato per una specifica architettura di computer.
Perché è utile ASM?
Il linguaggio macchina è una serie di numeri, che non è facile da leggere per gli umani. Usando ASM, i programmatori possono scrivere programmi leggibili dall'uomo che corrispondono quasi esattamente al linguaggio macchina.
Lo svantaggio è che tutto ciò che fa il computer deve essere descritto esplicitamente, in dettaglio preciso. Il vantaggio è che il programmatore ha il massimo controllo su ciò che il computer sta facendo.
Perché ASM è un linguaggio "di basso livello"?
Assembly è chiamato un linguaggio di programmazione di basso livello perché esiste (quasi) una relazione uno a uno tra ciò che dice al computer di fare e ciò che fa il computer. In generale, una riga di un programma di assemblaggio contiene un massimo di un'istruzione per il computer.
In che modo ASM differisce da una lingua "di alto livello"?
Le lingue di alto livello forniscono astrazioni di operazioni di basso livello che consentono al programmatore di concentrarsi maggiormente sulla descrizione di ciò che vogliono fare e meno su come dovrebbe essere fatto. Programmare in questo modo è più conveniente e rende i programmi più facili da leggere sacrificando il controllo di basso livello.
I programmi scritti in lingue di alto livello non corrisponderanno mai alla velocità e all'efficienza dei programmi scritti in assembly. Esempi di linguaggi di alto livello includono Python, Java, JavaScript, Clojure e Lisp.
Che cos'è una lingua "di medio livello"?
Le lingue di livello intermedio o di livello inferiore forniscono alcune astrazioni di alto livello per semplificare la vita del programmatore, fornendo comunque accesso alle operazioni di basso livello. Sono spesso utilizzati per scrivere sistemi operativi, quindi a volte vengono chiamati linguaggi di programmazione del sistema.
I programmi scritti in lingue di medio livello possono anche funzionare, o quasi, anche programmi scritti in linguaggio assembly. Esempi di linguaggi di programmazione di medio livello includono C, C ++, Ada, Nim e Rust.
ASM è portatile?
No. Poiché i linguaggi di assemblaggio sono legati a una specifica architettura di computer, non sono portatili. Un programma scritto in una lingua di assemblaggio dovrebbe essere completamente riscritto per funzionare su un altro tipo di macchina.
La portabilità è uno dei principali vantaggi delle lingue di livello superiore. Il linguaggio di programmazione C viene spesso chiamato "assembly portatile" perché esistono compilatori C per quasi tutte le moderne architetture di sistema. Un programma scritto in C potrebbe richiedere alcune modifiche prima di essere compilato su un altro computer, ma il linguaggio di base è portatile.
In generale, più una lingua è di livello superiore, meno modifiche devono essere apportate affinché funzioni su un'altra architettura. Le lingue di livello più basso - linguaggio macchina e linguaggio assembly - non sono portatili.
Esempio: Ciao, mondo! in assembly a 32 bit, per Windows
Ecco "Hello, World" scritto per un processore Intel a 32 bit. Funzionerà anche su un processore a 64 bit. Compileremo ed eseguiremo su Windows 10.
global _main extern _printf section .text _main: push messaggio chiamata _printf aggiungi esp, 4 messaggio ret: db 'Hello, World!', 10, 0
Per iniziare, apri Blocco note. Copia e incolla il codice sopra in un nuovo file di testo e salva il file come hello.asm.
Per compilare l'assembly, utilizziamo NASM, l'assemblatore Netwide. Può essere scaricato dal sito NASM.
nasm -f win32 hello.asm
Quando si esegue questo comando, NASM crea un file oggetto. Un file oggetto contiene codice macchina, ma non è proprio un file eseguibile. Il nostro file oggetto si chiama hello.obj.
Per creare il file eseguibile, utilizziamo la versione a 32 bit di MinGW (Minimal GNU per Windows) che fornisce il compilatore gcc. Può essere scaricato dal sito MinGW.
gcc -o hello.exe hello.obj
Ciao
Ciao mondo!
Esempio: Ciao, mondo! in assembly a 64 bit, per Linux
Ecco "Hello, World" scritto per un processore Intel a 64 bit. Compileremo ed eseguiremo su Linux a 64 bit.
extern printf; la funzione C printf, da chiamare sezione .data; Sezione dati, variabili inizializzate msg: db "Ciao, mondo!", 0; La stringa C termina con 0 fmt: db "% s", 10, 0; Il formato printf, " n", sezione "0" .text; Inizia la sezione di codice globale principale; il punto di accesso standard gcc principale:; l'etichetta del programma per il punto di entrata push rbp; impostare lo stack frame, deve essere allineato mov rdi, fmt mov rsi, msg mov rax, 0; può anche essere: xor rax, rax call printf; Chiama la funzione C printf pop rbp; ripristina stack mov rax, 0; normale, nessun errore, valore restituito ret; ritorno
Copia e incolla questo programma in un nuovo file chiamato hello.asm.
Quindi, compilare l'assembly con NASM, che è possibile installare con il proprio gestore pacchetti. Ad esempio, su Ubuntu o Debian, è possibile installare NASM usando apt:
sudo apt update && sudo apt installa nasm
Esegui questo comando per creare il tuo file oggetto:
nasm -f elf64 hello.asm
Il file oggetto è denominato hello.o.
Quindi, usa gcc per collegare questo file oggetto alle librerie necessarie sul tuo computer e compilarlo in un file eseguibile chiamato ciao:
gcc ciao. ciao ciao
Infine, esegui il file eseguibile:
./Ciao
Ciao mondo!
Per riferimento, questo è lo stesso programma, scritto in C:
#include <stdio.h> int main () {char msg [] = "Ciao mondo n"; printf ( "% s n", msg); ritorna 0; }