Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Capitolo 2

Home » Programma il Computer » Tutorial Assembly

Capitolo 2 - Gli strumenti di lavoro

  Gli strumenti di Lavoro

ASSEMBLATORE 3/17 [22 di 87] 

    

   Aggiornato 18 settembre 2006
    Come l'Assemblatore tratta le Etichette?
     
bulletCi sono alcuni aspetti dell'assemblatore che devono essere messi in evidenza:
bulletlegge e interpreta ogni parola del sorgente Asm, sostituendola con codice macchina (se è lo mnemonico di una istruzione, come JMP o MOV) o con servizi per migliorare il prodotto finale (se è una direttiva, come ORG).
Il numero di bytes di codice macchina dipende dall'istruzione da codificare: raramente basta solo il codice operativo (cioè solo un byte) ma si può arrivare anche a 6 bytes per istruzione...
bulletritiene etichette tutte le altre parole non incluse nelle sue Tabelle di Conversione: le etichette sono indirizzi espressi in forma simbolica; uno dei compiti dell'assemblatore è proprio quello di predisporre la loro raccolta nella Tabella delle Etichette (o Tavola dei Simboli).

      

bulletSolo per fissare le idee va sottolineato che, nella colonna ad esse dedicata, le etichette possono essere definite con o senza i : (2 punti):
bulletquelle non terminate con : (2 punti), di solito definite al di fuori della sequenza delle istruzioni, sono relative a:
bulletcostanti, se definite con la pseudooperazione EQU (_esc EQU 1BH).
bulletvariabili, se definite (p.es.) con la pseudoistruzione DB o DW (attrib DB 00H).

      

bulletquelle terminate con : (2 punti) sono necessarie per identificare indirizzi importanti del programma, ovviamente definite in punti non prevedibili all'inizio; si tratta di punti a partire dai quali si definiscono procedure del programma o verso i quali è necessario saltare

      

bulletIn entrambi i casi il compilatore provvede a calcolare il valore corrente del contatore di programma corrispondente all'indirizzo della linea di programma in cui è rilevata l'etichetta, e ad inserirne il valore direttamente in Tabella.

      

Ricorda... Per completare la traduzione di un codice sorgente l'assemblatore deve compiere "2 passate" (cioè deve leggere il testo 2 volte):
nella prima scansione si occupa solo di creare la Tavola dei Simboli, cioè annota tutte le etichette che trova e associa loro i rispettivi valori
solo nella seconda scansione crea il codice macchina, avendo a disposizione tutti i dati necessari per compilarlo (i bytes del codice mnemonico:dalle Tabelle Interne di Conversione e quelli delle etichette dalla Tavola dei Simboli, ora completa.

      

bulletNaturalmente le informazioni assunte durante la prima passata serviranno per garantire un indirizzo alle etichette presenti a destra dei rispettivi mnemonici, intese come operandi delle istruzioni:
bulletdi salto (JMP) o di chiamata (CALL), di solito relativi a etichette con i : (2 punti) finali
bulletdi gestione memoria (come MOV o ADD o altro...), di solito relativi a etichette senza i : (2 punti) finali, perchè associate (come detto) per esempio a variabili

      

bulletAl termine delle 2 passate l'assemblatore rende disponibile un codice oggetto quasi funzionate (il file OBJ) nel quale:
bulletle etichette operando delle istruzioni CALL (relative agli enty point delle procedure) saranno codificate con un valore nullo 0000H, pur rendendo disponibile il loro indirizzo nella Tavola dei Simboli e un marcatore in grado di ricordare che si tratta di un indirizzo interno rilocabile.
bulletle etichette operando delle istruzioni JMP (o Jxx, relative ai punti a cui saltare) saranno sostituite direttamente nel codice macchina da un numero con segno rappresentante la distanza (in bytes) dal punto di programma in cui è definita l'etichetta stessa; per questa codifica è prevista una coppia di bytes per cui:
bullet se la distanza tra i punti è breve (NEAR) e l'etichetta è definita dopo la linea di programma, sarà necessario un numero a 16 bit compreso tra 3 (0003H) e 32767 (7FFFH), in pratica il numero di bytes tra l'istruzione che usa l'etichetta come operando e quella che definisce l'etichetta (esclusi i bytes necessari per definirle)
bullet se la distanza tra i punti è breve (NEAR) e l'etichetta è definita prima della linea di programma, sarà sarà necessario un numero a 16 bit compreso tra 32768 (8000H) e -3 (FFFCH), in pratica il numero di bytes tra l'istruzione che usa l'etichetta come operando e quella che definisce l'etichetta (compresi i bytes necessari per definirle)
bulletse la distanza tra i punti topici è vicina (SHORT) basterà un numero a 8 bit compreso tra 3 (03H) e 127 (7FH) [con etichetta definita dopo] o tra 128 (80H) e -3 (FCH) [con etichetta definita prima]; in questo caso, poichè il terzo bytes previsto dal codice mnemonico non è necessario, l'assemblatore lo codifica con 90H, NOP

      

bulletPuò succedere, infine, che talune istruzioni citino etichette non presenti nel programma; in questo caso il loro valore non è noto e l'assemblatore:
bulletprovvederà a codificarle con un valore nullo 0000H e ad associare al loro nome lo stesso valore, nella Tavola dei Simboli, marcandolo in modo di ricordare che si tratta di un indirizzo interno esterno
bulletpretende però che queste etichette fantasma siano dichiarate EXTRN prima della sequenza delle istruzioni; si tratta certamente di procedure (EXTRN BioChr1:near) o variabili (EXTRN Variab8:byte o EXTRN Variab16:word) definite in librerie esterne, che saranno assunte solo dopo la successiva fase di link (i famosi riferimenti irrisolti...)

      

Suggerimento
L'uso delle Etichette è una magia dell'assemblatore; senza di esse sarebbe necessario calcolare e annotarsi gli indirizzi di tutti i punti importanti del nostro programma (come succedeva durante i nostri primi esercizi, assemblando in ambiente Debug); 
Già questa operazione è certamente paranoica, ma la pazzia sarebbe assicurata se, per una improrogabile necessità, fossimo costretti a inserire nuove istruzioni in qualunque punto del codice sorgente: sarebbe necessario ricalcolare tutti gli indirizzi da capo!
Meglio dunque lasciar fare all'assemblatore, nella sua ormai famosa prima passata!

      

bulletPer rendere eseguibile  il codice e comunque necessario l'intervento del linker, al quale spetta il compito di sostituire gli indirizzi provvisori 0000H con quelli effettivi, calcolati a partire da quelli presenti nella Tavola dei Simboli se di tipo rilocabile interno, o a partire dall'indirizzo in cui le procedure esterne sono state importate, se si tratta di un riferimento marcato esterno.

    

Pagina Precedente Capitolo 2 Pagina Successiva ASSEMBLATORE 3/17   Torna alla Home  del Capitolo1 del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
22 di 87
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

    

CAP 2 » 1. Catena di Compilazione 2. Editor 3. Assemblatore 4. Linker 5. Exe2Bin
6.
Ambiente di Lavoro 7. Gestore d'Ambiente Macro 8. Gestore d'Archivi OG
9. Matrici per i Programmi Sorgente 10. Gestore di Librerie Lib 
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati