Linguaggio assembly: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Riga 22:
==Caratteristiche generali dell'assembly==
L'assembly ha lo scopo generale di consentire al programmatore di ignorare il formato [[bit (informatica)|binario]] del linguaggio macchina.
Ogni [[codice operativo]] del linguaggio macchina viene sostituito, nell'assembly, da una sequenza
essere trascritto come <code>ADD</code> e quello per il [[GOTO|salto]] come <code>JMP</code>. In secondo luogo, i dati e gli [[indirizzo di memoria|indirizzi di memoria]] manipolati dal programma possono essere scritti, in assembly, nella [[sistema di numerazione|base numerica]] più consona al momento: [[Sistema numerico esadecimale|esadecimale]], [[Sistema numerico binario|binaria]], [[Sistema numerico decimale|decimale]], [[Sistema numerico ottale|ottale]] ma anche in forma simbolica, utilizzando stringhe di testo (identificatori).
Il programma assembly risulta in questo modo relativamente più [[leggibilità|leggibile]] di quello in linguaggio macchina, con il quale mantiene però un totale (o quasi totale) [[isomorfismo]].
Riga 208 ⟶ 210:
</source>
Per la maggioranza delle applicazioni ''mainstream'', è ormai convinzione comune nella comunità dei programmatori applicativi che fattori come le ottimizzazioni generate automaticamente dai compilatori nei linguaggi di più elevato livello, l'evoluzione di librerie a loro volta sempre più ottimizzate (almeno in linea di principio) e la sempre maggiore potenza elaborativa delle piattaforme comunemente diffuse rendano meno necessario rispetto al passato il ricorso alla verticalizzazione tramite assembly inline o moduli assembly, anche in favore della [[Portabilità|portabilità]] e leggibilità del codice. Tuttavia, non mancano numerose eccezioni in totale controtendenza rispetto a tale diffusa concezione: in particolare nel mondo dei sistemi dedicati, basato quasi per definizione su un paradigma ben diverso, come ricordato al paragrafo "Non c'è un solo assembly", ma anche in numerose nicchie specialistiche ai margini del ''mainstream'', dai sistemi CAD/CAM al calcolo numerico, alle applicazioni scientifiche di varia natura, fino allo sviluppo di driver e altro software di sistema.
==Strutture di controllo in Assembly x86==
Riga 247 ⟶ 249:
istruzioni
finché condizione
''in assembly, attraverso la logica dei salti, viene rappresentato così:''
''
inizio_ciclo:
istruzioni
Jcondizione inizio_ciclo
''esempio:''
''
MOV AX, 0000h
Riga 275 ⟶ 277:
CMP AX, 000Ah
JB inizio_ciclo ; salta se minore (invece di salta se non uguale)
''In questo modo abbiamo risolto il problema del ciclo infinito. Tuttavia, a causa del fatto che la sequenza viene eseguita almeno una volta, in genere si evita il ciclo a controllo in coda e si utilizza invece quello a controllo in testa.''
'''Il ciclo a controllo in testa (while)'''
Riga 284 ⟶ 286:
istruzioni
fine ciclo
''Equivale alla while (condizione) { sequenza } del C.''
in assembly:
''
Riga 292 ⟶ 294:
JMP inizio_ciclo
fine_ciclo
''esempio:''
''
inizio_ciclo:
Riga 300 ⟶ 302:
JMP inizio_ciclo
fine_ciclo
''La differenza tra questa struttura e quella a controllo in coda sta nel fatto che se la condizione è inizialmente verificata, la sequenza di istruzioni non viene eseguita nemmeno una volta.''
'''Il ciclo a contatore (for)'''
Riga 311 ⟶ 313:
incrementa CONTATORE
fine ciclo
''Possiamo utilizzare un ciclo a contatore se vogliamo ripetere un blocco di istruzioni per un numero di volte noto a priori.''
i cicli in assembly sono in genere a decremento:
''
Riga 353 ⟶ 355:
MOV AH, 01h ; servizio 01h
INT 21h ; se AX=0001h, allora in AL va il codice ASCII del tasto premut
''E volendo poi stamparlo:''
''
MOV DL,AL ; copio il codice ASCII del tasto letto il DL
|