Impariamo l’Assembly con Jasmin

L'Assembly è il linguaggio più difficile che esista e, a ragione, i programmatori hanno un po' di timore nell'impararlo. Per la codifica di semplici azioni occorre scrivere una notevole quantità di codice. Ma la velocità è il suo punto di forza, in quanto la filosofia operativa è vicinissima a quella del linguaggio macchina. Vediamo come Jasmin ci aiuta a comprendere tale linguaggio di programmazione.

Introduzione

Iniziamo con una distinzione di termini: per Assembly si intende propriamente il linguaggio di programmazione, mentre Assembler è un programma che traduce tale linguaggio in una forma comprensibile al calcolatore.

La funzione di Jasmin è quella di essere un semplice assembler e la sua sintassi è estremamente chiara e pulita. Al seguente link un approfondimento sull'assembler dal titolo "Come ottimizzare il codice assembler dei PICmicro". L'ideale per imparare "facilmente" tale linguaggio di programmazione. Il suo scopo è anche quello di creare funzionalità per la Java Virtual Machine, convertendo il sorgente testuale in una classe di Java sottoforma di file binario, ma l'articolo si focalizza esclusivamente sui primi rudimenti dell'Assembly. Può essere scaricato all'indirizzo http://wwwi10.lrr.in.tum.de/~jasmin/

Consiste in un unico file con estensione "jar" che può essere eseguito se si ha installato Java sulla propria macchina. Al momento della scrittura del presente articolo, il nome di tale file eseguibile è jasmin-1.5.11.jar. E' sufficiente cliccarlo due volte per poter lanciare immediatamente l'ambiente operativo, come visibile in figura 1.

Figura 1: esecuzione di Jasmin

Figura 1: esecuzione di Jasmin

Come si nota, si tratta di un interprete, quindi niente compilazioni ne' generazione di eseguibili. Tutto il lavoro si sviluppa in modo estremamente leggero e pratico.

Il nostro primo programma

Ovviamente chi si cimenta a scrivere un listato in Assembly deve cominciare a familiarizzare un po' con le sue istruzioni e, soprattutto, con i registri a disposizione, ossia particolari celle di memoria che possono contenere determinati valori (proprio come le variabili). Un approfondimento sui registri lo si trova al seguente articolo dal titolo "Come scambiare un registro con W in assembler".

Scegliendo la voce "New" del menù "File" si accede all'editor vero e proprio, raffigurato in figura 2. Esso è composto dal visualizzatore dei registri, dei flags, della memoria e, ovviamente, dall'editor testuale.

Figura 2: l'ambiente di Jasmin

Figura 2: l'ambiente di Jasmin

Nell'architettura a 32 bit, la memoria utilizza particolari registri di tale dimensione (vedi figura 3). Si tratta di speciali (e velocissime) celle (EAX, EBX, ECX e EDX) che possono contenere valori compresi tra 0 e 2^32-1 (ossia 4.294.967.295). Ogni registro può essere anche utilizzato come registri a 16 bit (AX, BX, CX e DX) e, ulteriormente, a 8 bit (AH, AL, BH, BL, CH, CL, DH, DL). In altre parole, è inutile utilizzare un recipiente di mille litri se dobbiamo versare solamente 10 litri d'acqua.

Figura 3: i registri Intel x86

Figura 3: i registri Intel x86

Scriviamo sull'editor il seguente sorgente in Assembly.

MOV AX,100
ADD AX,33
ADD AX,22
ADD AX,10

Il listato è semplicissimo. Esso inizializza il registro AX al valore di 100, poi gli aggiunge 33, quindi aggiunge 22 e infine aggiunge 10. Il valore finale è, dunque, 165. Per l'esecuzione del programma è sufficiente premere il tasto con la freccia verde, posto sulla barra degli strumenti, in alto.

Come facciamo a verificare la correttezza dei risultati? E' sufficiente dare un'occhiata alla finestra dei registri, posta sulla sinistra della videata, come mostrato in figura 4. Si possono visualizzare i valori in formato binario, decimale ed esadecimale.

Figura 4: esecuzione del primo programma

Figura 4: esecuzione del primo programma

E' possibile anche eseguire il sorgente linea per linea (step by step) premendo il tasto con la freccia verde e la stanghetta gialla, posto a sinistra del tasto con la sola freccia verde (Run). Si possono osservare, in tal modo, le evoluzioni dei registri, a ogni istruzione eseguita.

La metodologia utilizzata nell'esempio è definita indirizzamento immediato, nella quale l'operando è una costante.

Swap di due registri

Il prossimo semplice esempio propone il classico problema dello scambio del contenuto di due registri o di due variabili. Esistono, a riguardo, diversi metodi. Il più semplice prevede l'appoggio provvisorio del valore su un terzo registro di comodo, secondo il seguente listato. Dopo l'esecuzione si può verificare che il contenuto dei due registri è stato effettivamente scambiato.

;----Inizializza i due registri EAX a 234 e EBX a 155---
MOV EAX,234
MOV EBX,155
;------Effettua lo scambio con il terzo registro di comodo---
MOV ECX,EAX
MOV EAX,EBX
MOV EBX,ECX
MOV ECX,0

Un altro modo per poter "swappare" due registri è quello di usare l'istruzione XCHG. Essa permette di rendere molto veloci i programmi, dal momento che utilizza pochi cicli macchina per la sua esecuzione e non è richiesto l'utilizzo del terzo registro di comodo.

;----Inizializza i due registri EAX a 234 e EBX a 155---
MOV EAX,234
MOV EBX,155
;------Effettua lo scambio con l'istruzione XCHG---
XCHG EAX,EBX

Ancora un ulteriore metodo permette di scambiare i due valori, utilizzando l'istruzione logica XOR. Il listato è il seguente.

;----Inizializza i due registri EAX a 234 e EBX a 155---
MOV EAX,234
MOV EBX,155
;------Effettua lo scambio con l'istruzione XOR---
XOR EAX,EBX
XOR EBX,EAX
XOR EAX,EBX

E' possibile osservare l'effetto degli scambi in figura 5.

Figura 5: lo scambio di due registri

Figura 5: lo scambio di due registri

Display a 7 segmenti

Jasmin è dotato di un comodo display, completamente personalizzabile, con cui visualizzare le cifre numeriche. La figura 6 mostra il display in questione. Il seguente listato provvede all'indirizzamento delle singole cifre.

mov EBX,0
mov [EBX],7
mov EBX,1
mov [EBX],6
mov EBX,2
mov [EBX],63
mov EBX,3
mov [EBX],91
Figura 6: il display a 7 segmenti

Figura 6: il display a 7 segmenti

Altri tools

Jasmin mette a disposizione altri tools molto utili. Come si evince dalla figura 7, essi sono uno StripLight, una finestra di console e un display grafico, tutti con caratteristiche impostabili dall'utente. Al seguente link un approndimento sul controllo dei display OLED dal titolo "Colleghiamo un display OLED ad ESPertino".

Figura 7: i tools di Jasmin

Figura 7: i tools di Jasmin

Conclusioni

Lo spazio è tiranno, ci sarebbero tante cose da aggiungere, ma siamo sicuri che gli appassionati programmatori sapranno ottenere tanto aiuto e beneficio da questo ottimo programma. E Voi avete avuto esperienza con questo linguaggio? Vi sembra interessante?

 

Iscriviti e ricevi GRATIS
Speciale Pi

Fai subito il DOWNLOAD (valore 15€) GRATIS

17 Commenti

  1. Giovanni Di Maria Giovanni Di Maria 9 settembre 2017
  2. Doc77 Doc77 10 settembre 2017
  3. Giovanni Di Maria Giovanni Di Maria 10 settembre 2017
  4. Riccardo Ventrella Riccardo Ventrella 11 settembre 2017
    • Giovanni Di Maria Giovanni Di Maria 11 settembre 2017
  5. Riccardo Ventrella Riccardo Ventrella 11 settembre 2017
  6. Luca Giuliodori Luca Giuliodori 11 settembre 2017
    • Riccardo Ventrella Riccardo Ventrella 11 settembre 2017
  7. Domenico Antenucci 11 settembre 2017
  8. Gabriele Guizzardi. 12 settembre 2017
  9. Doc77 Doc77 12 settembre 2017
  10. Riccardo Ventrella Riccardo Ventrella 12 settembre 2017
  11. Riccardo Ventrella Riccardo Ventrella 12 settembre 2017
    • Giovanni Di Maria Giovanni Di Maria 12 settembre 2017

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Iscriviti e ricevi GRATIS
Speciale Pi

Fai subito il DOWNLOAD (valore 15€) GRATIS