Scrivere un programmino assembly è molto semplice, come detto basterebbe un semplice editor di testo con cui salvare i file.
E’ un linguaggio non case sensitive, ovvero che si scriva in stampatello o minuscolo è indifferente. I file che prepariamo possono anche non avere estensione o una testuale qualsiasi, ma per coerenza e visibilità migliore li nominiamo con estensione .asm, ovvero ad esempio “mioprogramminoesempio.asm”. Per quanto riguarda la notazione, esistono due tipi di notazione assembly. Quella di seguito è detta compatta ed è preferibile, a nostra opinione, poiché con delle istruzioni in pseudo-codice o pseudo-operazioni si risparmiano alcuni passaggi necessari alla preparazione dell’ambiente di esecuzione e l’uscita ed arresto dello stesso. Il codice, si faccia attenzione, è testato sul emulatore EMU8086 e SAMS. Altri emulatori/assemblatori potrebbero richiedere altre notazioni. Online ci sono anche svariati IDE x86 ma non hanno perfetta compatibilità e richiederebbero altre considerazioni che vogliamo semplificare usando le istruzioni x8086 in quella che viene detto “Intel Code”, che si distingue dalla versione AT & T. Vediamo una ossatura di ogni nostro esercizio e, di seguito, una spiegazione delle singole voci.
Indice dei contenuti
Versione con IDE EMU8086 e assembler FASM
; titolo
; descrizione
.MODEL SMALL
.STACK
.DATA
.CODE
.STARTUP
.EXIT
END
Commenti
Come in ogni linguaggio che si rispetti esistono porzioni di codice ignorabili dal compilatore ma che servono a noi umani a meglio comprendere quello che scriviamo. Come in C/C++ si commenta codice o testo utile con // o /* */, in assembly si usa ; (punto e virgola) per commenatre una singola riga. Contrariamente al C, la terminazione di una riga istruzione non necessita di ; se non appunto per inserire un commento. In genere in EMU8086 sono colorati di verde proprio per differenziare dal codice eseguibile nero, blu e rosso.
Pseudoistruzione .MODEL SMALL
Indica al compilatore il modello di memoria da usare. Un po’ come dire “quanta memoria serve per il programma”. Suona strano ma small è per memorie di 64KByte, Medium fino ad 1 MByte tantissimo per l’epoca mentre oggi fa ridere! A seconda del modello, ci sono delle limitazioni sui registri e le loro applicazioni ma esulano un po’ dai nostri obiettivi e si rimanda quindi ad una spiegazione più dettagliata qui. E’ opzionale per i nostri esercizi dove non inseriamo variabili, ma tanto vale dichiararlo sempre.
Area dello Stack .STACK
E’ una zona tipicamente gestita dal compilatore ed in genere non è accessibile direttamente dal programmatore tranne che con l’assembly con particolari istruzioni. Contiene in genere le locazioni di memoria per le variabili globali ed altri parametri che hanno a che fare con procedure, funzioni, indirizzi di variabili a puntatore. E’ opzionale per i nostri esercizi a meno che non ci siano variabili dichiarate. Conviene inserirlo sempre, eventualmente aggiungendo la dimensione da riservare es. .STACK 256 o .STACK 100h
Area Dati .DATA
E’ un’area di memoria sia di lettura che di scrittura a differenza delle altre, e contiene le variabili globali che possono essere usate dal programma durante il suo ciclo. Il programmatore alloca staticamente una certa quantità di memoria per contenere svariati tipi di dato, una sorta di contenitore universale in pratica. E’ opzionale per i nostri esercizi a meno che non ci siano variabili dichiarate. Conviene inserirlo sempre.
Area Codice .CODE
E’ la parte dove inserire le istruzioni da eseguire durante l’esecuzione del programma ovvero a runtime.
Pseudoistruzione .STARTUP
E’ una semplificazione che nasconde sotto una serie di istruzioni che preparano il software ad essere eseguito:
mov ax, @data
mov ds, ax
mov es, ax
Evitiamo di commentarle, sono fisse, andrebbero sempre inserite a patto di contrarle appunto con la notazione .STARTUP
Pseudoistruzione .EXIT
Non è un mistero, come .STARTUP cela una contrazione delle operazioni fisse:
mov ax, 4c00h
int 21h
che chiudono il software e ritornano il controllo al sistema operativo.
Versione con IDE EMU8086 e assembler FASM semplificto
Esiste anche la possibilità di non utilizzare la suddivisione in “aree” e utilizzare un template estremamente ridotto:
;titolo
;descrizione
org 100h
ret
dove viene semplificata l’area “di stack” con l’istruzione org 100h e l’uscita dal programma semplificata con l’istruzione ret finale.
Versione SAMS con assembler NASM
SAMS semplifica un po’ la vita del programmatore. Prima di tutto supporta i registri a 32bit, dando un tocco di modernità e parte già utilizzandoli nel suo template di apertura che è il seguente.
%include “io.inc”
section .text
global CMAIN
CMAIN:
;write your code here
xor eax, eax
ret
La prima riga è la piccola perla di questo IDE: ha già una piccola libreria con le funzioni di input/output preconfezionate. Come scoprirà il lettore, tali funzioni sono alquanto noiose da ricordare e necessitano di diverse istruzioni. Il resto ha ancora le sezioni ma vedete la differenza con la dicitura section, mentre il .code e . startup son o rimpiazzati da global CMAIN. Anche l’uscita .exit end è rimpiazzata dal ret con una pulizia preventiva del registro accumulatore eax, già in formato 32bit.
Ultima modifica 31 Gennaio 2022