Cos'è il linguaggio assembly?

A volte indicato come assembly o ASM, un linguaggio assembly è un linguaggio di programmazione di basso livello.

I programmi scritti in linguaggio assembly sono compilati da un assemblatore. Ogni assemblatore ha il proprio linguaggio assembly, progettato per una specifica architettura del computer.

Il linguaggio macchina è solo 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, con dettagli precisi. Il vantaggio è che il programmatore ha il massimo controllo su ciò che il computer sta facendo.

Perché l'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 e ciò che fa il computer. In generale, una riga di un programma di assemblaggio contiene al massimo un'istruzione per il computer.

In che modo ASM è diverso da un linguaggio "di alto livello"?

I linguaggi di alto livello forniscono le 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 a scapito del controllo a basso livello.

I programmi scritti in linguaggi 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 "livello medio"?

Le lingue di livello medio o inferiore forniscono alcune astrazioni di alto livello per semplificare la vita del programmatore, garantendo comunque l'accesso a operazioni di basso livello. Sono spesso usati per scrivere sistemi operativi, quindi a volte vengono chiamati linguaggi di programmazione di sistema .

I programmi scritti in lingue di medio livello possono essere eseguiti, o quasi, come 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 del computer, non sono portatili. Un programma scritto in un linguaggio assembly dovrebbe essere completamente riscritto affinché possa essere eseguito su un altro tipo di macchina.

La portabilità è uno dei principali vantaggi dei linguaggi di livello superiore. Il linguaggio di programmazione C viene spesso chiamato "assembly portatile" perché i compilatori C esistono per quasi tutte le moderne architetture di sistema. Un programma scritto in C può richiedere alcune modifiche prima che possa essere compilato su un altro computer, ma il linguaggio principale è portatile.

In generale, il livello più alto di una lingua è, meno modifiche devono essere apportate per farlo funzionare su un'altra architettura. Le lingue di livello più basso - linguaggio macchina e linguaggio assembly - non sono portabili.

Esempio: Hello, World! nell'assemblaggio a 32 bit, per Windows

Ecco "Hello, World" scritto per un processore Intel a 32 bit. Funzionerà anche su un processore a 64 bit. Lo compileremo ed eseguiremo su Windows 10.

 global _main extern _printf section .text _main: push message call _printf add esp, 4 ret messaggio: 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, useremo NASM, l'Netwide Assembler. Può essere scaricato su //www.nasm.us/.

 nasm -f win32 hello.asm 

Quando si esegue questo comando, NASM crea un file oggetto. Un file oggetto contiene codice macchina, ma non è un file eseguibile. Il nostro file oggetto è chiamato hello.obj .

Per creare l'eseguibile, useremo la versione a 32 bit di MinGW (Minimal GNU per Windows) che fornirà il compilatore gcc. Può essere scaricato su //www.mingw.org/.

 gcc -o hello.exe ciao.obj 
 Ciao 
 Ciao mondo! 

Esempio: Hello, World! nell'assemblaggio a 64 bit, per Linux

Ecco "Hello, World" scritto per un processore Intel a 64 bit. Lo 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 globale del codice; il principale punto di ingresso gcc standard:; l'etichetta del programma per il punto di ingresso push rbp; imposta lo stack frame, deve essere allineato mov rdi, fmt mov rsi, msg mov rax, 0; può anche essere: xor rax, rax call printf; Chiama C funzione printf pop rbp; ripristina stack mov rax, 0; normale, nessun errore, valore di ritorno ret; ritorno 

Copia e incolla questo programma in un nuovo file chiamato hello.asm .

Quindi, compilare l'assieme con NASM, che è possibile installare con il proprio gestore pacchetti. Ad esempio, su Ubuntu o Debian, puoi installare NASM usando apt:

 sudo apt update && sudo apt install nasm 

Esegui questo comando per creare il tuo file oggetto:

 nasm -f elf64 hello.asm 

Il file oggetto è denominato hello.o .

Successivamente, usa gcc per collegare questo file oggetto alle librerie necessarie sul tuo computer e compilarlo in un file eseguibile chiamato ciao :

 ciao ciao. ciao 

Infine, esegui il file eseguibile:

 ./Ciao 
 Ciao mondo! 

Per riferimento, questo è lo stesso programma, scritto in C:

 #include int main () {char msg [] = "Ciao mondo \ n"; printf ( "% s \ n", msg); ritorno 0; } 

  • Vedi routine di debug per altri esempi di codice assembly di basso livello e ulteriori informazioni su cosa fa ogni routine.
  • Per ulteriori esempi di linguaggio assembly, consultare il sito Web Happy Codings.

2GL, Assembler, Lingua di basso livello, Lingua macchina, Termini di programmazione