assemble
Quanto è ostico e complicato programmare nel linguaggio-macchina assembler!
francesco Melis su smanettando, 14\01\2014, h. 22.04.

d.
(omissis)

 Di quale processore non lo so, so solo che sono programmi assemblatori dove bisogna programmare il 
linguaggio macchina, quindi mettendo istruzioni come add o sub e indicare i registri coinvolti 
nelle operazioni. Io ho provato a installarli sul mio PC, che ha Windows 7 e jaws 13. Il problema è 
che quando li lancio, jaws continua a ripetere vuoto e ovviamente sulla barra non appare nulla, 
quindi io non leggo quello che sto scrivendo, anche se a monitor si legge tutto
r.

Adesso è un po' più chiaro.
Assembly, di per se, non è un programma, ma un linguaggio di programmazione a basso livello mirato 
alla programmazione di un determinato processore. C'è, quindi, per esempio, un linguaggio assembler 
per la famiglia intel x86 che è la classe di microprocessori dei comuni PC e linguaggi assembler 
per processori di altre case, per esempio il processore ad 8 bit Z80.
Il linguaggio assembler sta in rapporto uno ad uno con il linguaggio macchina. Si usa l'assembler 
poiché facendo uso di istruzioni mnemoniche è più semplice da scriverci i programmi anziché usare 
direttamente i codici numerici binari delle istruzioni macchina.
Per programmare in linguaggio assembler (o assembly se preferisci), si usano i programmi 
assemblatori e ne esistono molti anche freeware ed Open Source.
Tutti producono dopo l'operazione di assemblaggio il codice macchina per quel processore, vale a 
dire i programmi.
I programmi assemblatori per un determinato processore, prodotti da case diverse, pur producendo 
tutti codice eseguibile per quel processore su un determinato Sistema Operativo si differenziano 
per delle "direttive" che occorre specificare in testa al codice di un programma in assembler. 
Allora ci potrebbero essere delle piccole differenze fra le modalità di programmazione di un 
assemblatore della Microsoft rispetto ad uno della Borland o di altre case.
Però ci sono assemblatori che "clonano" le modalità di quelli famosi e risultano quindi compatibili 
a livello di codice sorgente con quelli che emulano.
Quindi, se il tuo assemblatore non è molto accessibile con il tuo ausilio, potresti provare a 
trovarne qualcuno, clone, che sia compatibile a livello di codice e magari un po' più accessibile 
all'ausilio.
Non so quale sia il tuo livello di preparazione di base sulla struttura dei microprocessori e quale 
sia il contesto per il quale ti è richiesto di saper programmare in assembler, però voglio in 
questa sede fare qualche considerazione dettata dalla mia esperienza.
Intanto si può programmare in assembler per un determinato particolare processore anche con 
assemblatori che girano su computers con sistema operativo e processori differenti rispetto a 
quello per il quale si sta programmando. Quindi, per esempio, si può programmare in assembler su un 
comune pc per produrre codice che giri su microcontrollori per schede dei ricevitori satellitari 
che hanno il loro specifico linguaggio macchina diverso da quello dei PC.
Secondo elemento:
Programmare il assembler è molto, molto difficile. Direi mooooooolto più difficile che programmare 
in Java, o C o Python.
Programmare in assembler per un processore moderno montato su un PC richiede anche, e 
necessariamente, una conoscenza molto elevata della struttura del processore, intesa come 
conoscenza dei suoi registri interni, stack pointer, registri di indirizzo, registro dei flag, 
registro delle interruzioni ecc... Programmare in assembler seriamente richiederebbe anche 
conoscere i diagrammi di timing dell'accesso alla memoria in lettura e scrittura e sapere ed usare 
bene i cicli macchina delle istruzioni per arrivare a produrre anche codice efficiente. Insomma 
occorre anche conoscere delle cose che non sono proprio alla portata di chi volesse dilettarsi 
cimentandosi con queste problematiche tecniche.
Cito qualche esempio tratto dalla mia esperienza.
A suo tempo ho studiato il microprocessore Z80 che veniva montato sugli home computer ZX Spectrum 
prodotti da Sinclair, (si parla dei primissimi anni '80), ed il processore Motorola MC68000 che 
veniva montato sui primi McIntosh di Apple. Ho studiato anche per l'esame di Calcolatori 
elettronici i processori della famiglia 8086 che venivano montati sui primi Pc.
Ebbene, mentre la programmazione in linguaggio macchina dello Z80 era ancora a portata di "essere 
umano" e si potevano fare tranquillamente, con il dovuto sforzo, ed in tempi ragionevoli, anche 
progetti hardware e software basati su quel processore, per il processore 8086 la complessità era 
talmente elevata che un corso universitario del quarto anno di ingegneria elettronica sarebbe stato 
assorbito solo per la conoscenza del processore. Quindi era troppo difficile fare progetti hardware 
con quel processore.
Allora nei dipartimenti di elettronica si erano inventati dei processori didattici a 32 bit che 
avessero una struttura più semplice da capire ed usare in modo da consentire di farci dei progetti 
hardware completi in tempi ragionevoli. Questi processori ovviamente erano solo delle simulazioni 
teoriche di un processore e non esistevano nella realtà. Comunque era sufficiente per farci dei 
progetti e verificarli con dei simulatori costruiti ad hoc.
Potrebbe essere allora che questo sia il tuo caso. Un processore didattico che non esiste nella 
realtà e che purtroppo ti obbliga a programmarci con quello specifico programma simulatore del 
processore. In tal caso se il simulatore non è molto accessibile al tuo ausilio non credo che ci 
sia molto da fare.
Comunque, alle brutte, si può programmare anche solo usando carta e penna o con il comunissimo 
blocco note e poi assemblare il tutto con un aiutino da parte di qualcuno che avvierebbe al tuo 
posto il processo di assemblaggio.
Certo, non è proprio uno scherzo, però si può fare. La programmazione si fa con la testa al di la 
dello strumento che poi userai per assemblare il tuo codice.
Io, per esempio, mi divertivo assai a programmare tutto su carta. E' una gran soddisfazione, ma 
occorreva metterci tutti i 5 sensi. Facendo tutto a mano devi anche calcolare a mano gli indirizzi 
di memoria nella quale andranno a finire le istruzioni per poterli inserire nelle istruzioni di 
salto assoluto o condizionato. In questo modo, molto artigianale invero, non c'è addirittura 
neanche bisogno del programma assemblatore dal momento che devi produrre tu, direttamente, a mano, 
il file eseguibile senza affidarti al traduttore.
Torna all'indice