Sabato, 21 Ottobre 2017 20:34

Scrivere il primo programma assembly

Scritto da

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.

 

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, eventualemnte 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 seziozioni 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.

 

Letto 696 volte
Prof. Alfredo Centinaro

Docente di "Scienze e tecnologie informatiche", "Tecnologie e progettazione di sistemi informatici", "Sistemi e Reti" presso IIS Alessandrini-Marino (Teramo), consulente e sviluppatore web. Ha collaborato per anni come sviluppatore presso MHT - Treviso, assistente Sistemi ed elaborazione dell'informazione in UniTE Corso di laurea in Scienze del turismo culturale, tutor presso Telecom Italia Learning Services (L'Aquila)

Joomla SEF URLs by Artio