Programmare in Assembler su Linux

La programmazione in linguaggio Assembler è molto impegnativa, perché occorre lavorare a livello di spostamenti di dati da un registro all’altro del processore, quindi è molto dipendente dalla piattaforma hardware su cui risiede. Oggi questo linguaggio viene utilizzato soltanto in determinati settori, come lo sviluppo di alcune parti come i device driver o comunque quando si ha il bisogno di operare vicino all’hardware della macchina. In questo articolo ci occuperemo dello sviluppo in Assembler su Linux con particolare riferimento agli strumenti per utilizzarlo.
Qualche decennio fa, utilizzando un Assembly, venne costruito il primo compilatore C, che poi fu la base per la costruzione del sistema Unix. Nel caso di Linux è il compilatore GCC della GNU ad essere lo strumento di sviluppo del kernel del sistema operativo. Tutti i compilatori infatti si basano su codice Assembler, che poi viene trasformato in codice macchina binario. Anche su Linux avviene questo procedimento, infatti se scriviamo un semplicissimo programma come questo:

// File test.c

#include "stdio.h"

int main(int argc, void** argv)
{
   printf("Ciao Mondo!\n");
   return 0;
}

e compiliamo con il comando:

gcc -Wall -o test test.c

possiamo visualizzare il codice assembler intermedio prodotto semplicemente dando questo comando:

gcc -S test.c

che produrra il file test.s contenente le istruzioni a basso livello per questa piattaforma (basta fargli un cat per vederlo). A questo punto possiamo anche cancellare il file in C sorgente ( test.c ) e compilare il file in codice Assembler:

gcc -o test test.s

ottenendo lo stesso risultato di prima, quindi con il compilatore GCC è possibile utilizzare sia codice C che Assembler.
Il GCC permette di scrivere codice Assembler nel corpo delle funzioni, utilizzando speciali keywords che segnalano al compilatore l’inizio di un blocco di codice Assembler. La sintassi è la seguente:

asm(“asm statements”);

Esiste anche un’altra forma del GCC inline detta “estesa”, secondo questa sintassi:

asm(“asm statements”, registri output, registri input, registri clobbered);

in questo caso dobbiamo fornire rispettivamente anche i valori di output, di input e con l’ultimo si dice a GCC di non contare sui registri specificati perché dopo l’esecuzione del codice Assembly potranno non contenere i valori originari.
Esistono anche altri strumenti per programmare in linguaggio Assembler su Linux, come NASM, ma credo che la scelta migliore sia proprio l’assemblatore della GNU perché si ha quasi la certezza che sarà sempre aggiornato ed allineato con l’hardware sottostante o più precisamente con i set di istruzioni più recenti.

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in Linux, Programmazione e contrassegnata con . Contrassegna il permalink.