4
di Andrea de Prisco Istruzioni, Registri, Operandi Col termine linguaggio macchina, convenzionalmente, si usa indicare il linguaggio di programmazione «vero» dei computer. l più preparati sanno infatti che il Basic di qualsiasi Personal computer, sebbene «residente» in memoria, è completamente simulato via software dall'interprete contenuto nelle rom di sistema: «l Processori, si sa, capiscono solo in termini di O e l dei codici di linguaggio macchina ...» E se vi dicessimo che spesso ciò non è vero, cosa rispondereste? Sapevate che a sua volta anche il più crudo dei linguaggi macchina può non essere eseguito direttamente dal Processore, ma ha bisogno di una ulteriore interpretazione da parte di un sottostante livello detto di microprogrammazione? Questo l'argomento scottante del prossimo mese: su questo numero, come introduzione all'argomento, solo un piccolo sguardo alle .istruzioni, ai registri e agli operandi tipici del livello convenzionale di macchina. II linguaggio macchina 8 bit, 16 bit, z80, 68000, PDP-II : co- me vedete in quanto a numeri, non possiamo proprio lamentarci. E in ef- fetti, un calcolatore calcola, e i calcoli si fanno coi numeri, salvo poche ecce- zioni di stampo lievemente più intelli- gente (anche se artificiale) del calcolo dei predicati dell'elaborazione dell'in- formazione non numerica nei sistemi esperti. Tranquilli, non stiamo per spiccare il volo: è troppo presto. Restiamo an- cora un po' vicino ai calcolatori tradi- zionali per vedere il linguaggio mac- china di queste bestioline. Senza ov- viamente fare un corso di Assembler, né puntare la nostra attenzione, come è consuetudine di «Appunti», su un particolare processore esistente. Sappiamo infatti che ogni unità di elaborazione programmabile ha un proprio linguaggio macchina col quale è possibile specificare la sequenza di istruzioni da compiere per svolgere le funzioni volute. Istruzioni, dal canto loro, tutte piuttosto semplici: solo combinandole opportunamente con gli altrettanto semplici meccanismi di controllo, e possibile programmare tutto ciò che si desidera, ovviamente a patto che sia calcolabile. Chi programma in Basic conoscerà le stringhe, le funzioni scientifiche, magari la doppia precisione: in lin- guaggio macchina non esiste niente di tutto ciò. Eppure in Assembler si fanno i compilatori di linguaggi di livello ben più alto del Basic: senza contare che un programma scritto interamente in linguaggio macchina può anche essere migliaia di volte più veloce dello stes- so programma scritto in Pascal, Algol o Fortran. Il punto è che programmare in As- sembler è assai più arduo che in qual- siasi altro linguaggio. Ciò essenzial- mente perché il linguaggio macchina risente appunto della «macchina» che vogliamo programmare. Non possia- mo ignorare la sua architettura inter- na, come funzionano e soprattutto co- me interagiscono le varie unità che la compongono, non senza avere una di- screta conoscenza dell'aritmetica bina- ria, anche se, come più volte detto, ri- mane così simile a quella decimale (in termini più precisi «isomorfa») che basta avere solo le idee chiare sulle 4 operazioni insegnateci alle elementari sui numeri naturali, per fare fronte a qualsiasi situazione anche in base due. Oltre a questo, quando abbiamo scritto il nostro bravo programmino in Assembler, e mandatolo in esecuzione non otteniamo il voluto, non aspettia- moci nemmeno messaggi d'errore da parte del computer, dovremo sbrigar- cela da soli, cercando un po' qua, un po' là, la causa del fallimento. Bit, Bite, parole di memoria Se un hobbynformatico dice a un al- tro: «sai, la Motorola ha fatto un nuo- vo Processore, il QT 54321...» potrem- mo ben scommettere che la prima do- manda che gli sarà posta dal collega sarà: «A quanti bit?». Pare infatti che le CPU si misurano a bit: 8, 16, 32. Nessuno chiederà mai, di primo acchi- to, la Performance, misurata in milioni di operazioni al secondo, né la sua ar- chitettura interna, che certamente non è da meno in quanto a influenza sulle prestazioni. Fra l'altro, dire che un processore è a 16 bit spesso non significa quello che vorremmo. In altre parole, cosa del nostro Processore, o meglio, del nostro calcolatore è a 16 bit? Potrebbe essere di tale formato il Bus di indirizzamento memoria, i regi- stri interni, le singole celle di memo- ria, il Bus dati. O tutto ciò insieme? Procediamo con ordine. Innanzitutto il Bus di indirizzamento è strettamente legato, come numero di bit, alla quan- tità di memoria di cui si dispone. Quindi 16 bit di tale Bus significa po- ter indirizzare solo 65536 celle (2 alla 16). Il Bus dati, di contro, è misura delle dimensioni delle celle di memoria, in altre parole quanti bit di memoria ven- gono trasferiti in seguito a un solo ac- cesso. Chi storcerà il naso lo farà sempli- cemente per colpa di questa bizzarra rivoluzione informatica domestica (del registratore e del joystick) che sta in- vadendo questi tempi moderni: ebbe- ne sì, non sta scritto da nessuna parte che le memorie dei calcolatori sono, per contratto, fatte da byte di 8 bit l'u- no. Possono avere le singole celle di 16 bit, di 32, di 64, di un solo bit, così come possono disporre di formati va- riabili a seconda delle applicazioni. Uffa! La convenzione comunque è che celle di 8 bit sono dette byte, se in for- mato minore nibbI e (4 bit), se in for- mato maggiore Parole o più comune- mente Word. Esistono poi visioni più ibride in cui la memoria è comunque indirizzabile a byte anche se è possibi- le accedere simultaneamente a 2 o più celle consecutive (nel caso di due spe- cificando sempre indirizzi pari, (fig. I)) avendo così al contempo una visio- ne a Word . ...oppure possono essere a 16 bit i registri interni, come dicevamo prima: di questo ne parleremo tra poco. 116 MCmicrocomputer n,54 - luglio/agosto 1986

Istruzioni, Registri, Operandi

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Istruzioni, Registri, Operandi

di Andrea de Prisco

Istruzioni, Registri, OperandiCol termine linguaggio macchina, convenzionalmente, si usa indicare il linguaggio di programmazione «vero» dei

computer. l più preparati sanno infatti che il Basic di qualsiasi Personal computer, sebbene «residente» in memoria, ècompletamente simulato via software dall'interprete contenuto nelle rom di sistema: «l Processori, si sa, capiscono solo in

termini di O e l dei codici di linguaggio macchina ...» E se vi dicessimo che spesso ciò non è vero, cosa rispondereste?Sapevate che a sua volta anche il più crudo dei linguaggi macchina può non essere eseguito direttamente dal Processore,ma ha bisogno di una ulteriore interpretazione da parte di un sottostante livello detto di microprogrammazione? Questo

l'argomento scottante del prossimo mese: su questo numero, come introduzione all'argomento, solo un piccolo sguardo alle.istruzioni, ai registri e agli operandi tipici del livello convenzionale di macchina.

II linguaggio macchina

8 bit, 16 bit, z80, 68000, PDP-II : co-me vedete in quanto a numeri, nonpossiamo proprio lamentarci. E in ef-fetti, un calcolatore calcola, e i calcolisi fanno coi numeri, salvo poche ecce-zioni di stampo lievemente più intelli-gente (anche se artificiale) del calcolodei predicati dell'elaborazione dell'in-formazione non numerica nei sistemiesperti.

Tranquilli, non stiamo per spiccareil volo: è troppo presto. Restiamo an-cora un po' vicino ai calcolatori tradi-zionali per vedere il linguaggio mac-china di queste bestioline. Senza ov-viamente fare un corso di Assembler,né puntare la nostra attenzione, comeè consuetudine di «Appunti», su unparticolare processore esistente.

Sappiamo infatti che ogni unità dielaborazione programmabile ha unproprio linguaggio macchina col qualeè possibile specificare la sequenza diistruzioni da compiere per svolgere lefunzioni volute. Istruzioni, dal cantoloro, tutte piuttosto semplici: solocombinandole opportunamente congli altrettanto semplici meccanismi dicontrollo, e possibile programmaretutto ciò che si desidera, ovviamente apatto che sia calcolabile.

Chi programma in Basic conosceràle stringhe, le funzioni scientifiche,magari la doppia precisione: in lin-guaggio macchina non esiste niente ditutto ciò.

Eppure in Assembler si fanno icompilatori di linguaggi di livello benpiù alto del Basic: senza contare cheun programma scritto interamente inlinguaggio macchina può anche esseremigliaia di volte più veloce dello stes-so programma scritto in Pascal, Algolo Fortran.

Il punto è che programmare in As-sembler è assai più arduo che in qual-siasi altro linguaggio. Ciò essenzial-mente perché il linguaggio macchinarisente appunto della «macchina» chevogliamo programmare. Non possia-mo ignorare la sua architettura inter-na, come funzionano e soprattutto co-me interagiscono le varie unità che lacompongono, non senza avere una di-screta conoscenza dell'aritmetica bina-ria, anche se, come più volte detto, ri-mane così simile a quella decimale (intermini più precisi «isomorfa») chebasta avere solo le idee chiare sulle 4operazioni insegnateci alle elementarisui numeri naturali, per fare fronte aqualsiasi situazione anche in base due.

Oltre a questo, quando abbiamoscritto il nostro bravo programmino inAssembler, e mandatolo in esecuzionenon otteniamo il voluto, non aspettia-moci nemmeno messaggi d'errore daparte del computer, dovremo sbrigar-cela da soli, cercando un po' qua, unpo' là, la causa del fallimento.

Bit, Bite,parole di memoria

Se un hobbynformatico dice a un al-tro: «sai, la Motorola ha fatto un nuo-vo Processore, il QT 54321...» potrem-mo ben scommettere che la prima do-manda che gli sarà posta dal collegasarà: «A quanti bit?». Pare infatti chele CPU si misurano a bit: 8, 16, 32.Nessuno chiederà mai, di primo acchi-to, la Performance, misurata in milionidi operazioni al secondo, né la sua ar-chitettura interna, che certamente nonè da meno in quanto a influenza sulleprestazioni.

Fra l'altro, dire che un processore èa 16 bit spesso non significa quelloche vorremmo. In altre parole, cosa

del nostro Processore, o meglio, delnostro calcolatore è a 16 bit?

Potrebbe essere di tale formato ilBus di indirizzamento memoria, i regi-stri interni, le singole celle di memo-ria, il Bus dati. O tutto ciò insieme?Procediamo con ordine. Innanzituttoil Bus di indirizzamento è strettamentelegato, come numero di bit, alla quan-tità di memoria di cui si dispone.Quindi 16 bit di tale Bus significa po-ter indirizzare solo 65536 celle (2 alla16).

Il Bus dati, di contro, è misura delledimensioni delle celle di memoria, inaltre parole quanti bit di memoria ven-gono trasferiti in seguito a un solo ac-cesso.

Chi storcerà il naso lo farà sempli-cemente per colpa di questa bizzarrarivoluzione informatica domestica (delregistratore e del joystick) che sta in-vadendo questi tempi moderni: ebbe-ne sì, non sta scritto da nessuna parteche le memorie dei calcolatori sono,per contratto, fatte da byte di 8 bit l'u-no. Possono avere le singole celle di16 bit, di 32, di 64, di un solo bit, cosìcome possono disporre di formati va-riabili a seconda delle applicazioni.Uffa!

La convenzione comunque è checelle di 8 bit sono dette byte, se in for-mato minore nibbI e (4 bit), se in for-mato maggiore Parole o più comune-mente Word. Esistono poi visioni piùibride in cui la memoria è comunqueindirizzabile a byte anche se è possibi-le accedere simultaneamente a 2 o piùcelle consecutive (nel caso di due spe-cificando sempre indirizzi pari, (fig.I)) avendo così al contempo una visio-ne a Word .

...oppure possono essere a 16 bit iregistri interni, come dicevamo prima:di questo ne parleremo tra poco.

116 MCmicrocomputer n,54 - luglio/agosto 1986

Page 2: Istruzioni, Registri, Operandi

Appunti di informatica

ByteOByte l

Byte N-l(A)

Figura 1

· ·· ···(B)

OPERAZIONE Il Byte' OPERAZIONE W~&AIWORDWORD O

12 WORD2 'Byte OPERAZIONEWORD 2 OPERANDO

OPERAZIONE3 Byte' OPERANDO l 3 WORD.

OPERANDO 2

OPERAZIONE OPERAZIONEOPERANDO l 4 Byte OPERANDO l 4·IiIORDWORD N-2 OPERANDO'2 OPERANDO 2OPERANDO 3 OPERANDO 3

(A) (B).Figura 2

Figura l - Memoria organizzata a Byte (A) e a word di due Byte l'una (B). Figura 2 - Occupazione memoria a.seconda del formato istruzione. (A) memoria a Byte.(B) memoria a word.

Operazioni & operandiEntriamo ora nel cuore del proble-

ma: il linguaggio. Abbiamo già dettoche le istruzioni con cui si programma-no i processor sono abbastanza sem-plici. Infatti non andranno molto oltrela somma di due numeri, qualche ope-razione sui bit di una cella, spostare ilcontenuto di una cella di memoria inun'altra cella e poco altro. Volendo az-zardare una classificazione delle istru-zioni di un generico linguaggio mac-china avremo un certo numero di ope-razioni per accedere alla memoria,operazioni per scrivere in memoria,operazioni aritmetiche, di test su celledi memoria e di salto condizionato enon, così come di chiamata e sottopro-gramma.

Il formato di una generica istruzio-ne sarà dunque del tipo

OP op1 .....opN

dove OP è l'operazione da compiere eopl...opN gli operandi su cui e seguirel'operazione di cui sopra. L'enne diopN ci indica il numero di operandidell'istruzione: avremo istruzioni a Ooperandi, a un operando così come adue o a tre. Potremo ad esempio som-mare 2 numeri con l'istruzione:

ADD 13,33

anche se in tal caso dovrebbe essereimplicito dove mandare il risultato.Oppure disporre di istruzioni che ri-chiedono esplicitamente una cella dimemoria per il risultato, esempio:

ADD 13.33,$1000

in questo caso il risultato è posto nellacella 1000. Altre tipiche istruzioni dilinguaggio macchina sono quelle disalto incondizionato (è un esempio diistruzione a un operando):

JMP $2000

che fa saltare alla cella 2000, dove si

suppone sia memorizzata la continua-zione del programma. O di salto con-dizionato:

BEQ $2000

che fa saltare alla cella 2000 se l'ope-razione precedente ha dato come risul-tato zero. Questo comunque lo vedre-mo meglio quando parleremo dellaProcessus Status Word. Un esempio diistruzione a O operandi potrebbe esse-re un comunissimo:

RTS

per ritornare da un sottoprogrammaattivato dall'istruzione:

JSR < indirizzo>

mentre, per finire, un'operazione ditrasferimento potrebbe essere:

MOVE $100, $101

che come è facilmente intuibile nel no-stro caso sposta il contenuto della cel-la 100 nella cella 101.

In figura 2 sono mostrati possibilimodi di memorizzare le istruzioni dilinguaggio macchina nel caso di me-moria indirizzabile a byte e a word didue byte l'una. Ad esempio possiamomettere il codice operativo di unaistruzione a zero operandi in un byte oin mezza word (in tal caso l'altra mez-za risulterebbe sprecata); se abbiamoun'istruzione a un solo indirizzo pos-siamo occupare due celle contigue,nella prima metteremo il codice opera-tivo nella seconda l'indirizzo; mentreper istruzioni a più indirizzi possiamooccupare un numero maggiore di cel-le, come prima una per il codice e lealtre per gli operandi.

Registri generalie strutture dati

Detto questo addentriamoci mag-giormente nel merito, illustrando le

strutture dati disponibili in linguaggiomacchina. Ogni processore disponeinfatti di un certo numero di registri,una struttura dati UFO detta Stackpiù una manciata di registri di uso piùparticolare che vedremo nel prossimoparagrafo.

I registri di uso generale servonoprincipalmente per non scomodare dicontinuo la memoria del calcolatore(che seppur dell'ordine di milionesimidi secondo ha tempi d'accesso tutt'al-tro che trascurabili) per le «variabili dicomodo» usate dai programmi. Sup-poniamo ad esempio di dover scam-biare il contenuto di due locazioni dimemoria: in un qualsiasi linguaggio diprogrammazione che non dispone diun tale comando, come è noto, ci oc-correrà una variabile temporanea pereffettuare lo scambio: potremmo usa-re ad esempio (caso sconsigliato)un'altra cella di memoria, la 1000.

Scambiamo allora la cella 1111 conla cella 2222:

MOVE $1111. $1000MOVE $2222. $1111MOVE $1000, $2222

effettuando la bellezza di 6 accessi inmemoria. Usando un registro internoal processore (qui li indicheremo conrO...rN) possiamo risparmiare due ac-cessi in memoria, risparmiando cosìsul tempo totale dell'intera operazio-ne:

MOVE $1111, rOMOVE $2222. $1111MOVE rO, $2222

Se qualche milionesimo di secondo inpiù o in meno vi fa sorridere, non di-menticate che il tempo perso è di soli-to cumulabile, quindi posto di doverscambiare cento mila celle di memoriatra loro, cento mila milionesimi di se-condo in alcuni casi possono anchefarsi notare.

Oltre a questo, useremo i registri in-terni anche per le operazione aritmeti-

MCmicrocomputer n. 54 -luglio/agosto 1986 117

Page 3: Istruzioni, Registri, Operandi

~"'--12-:"3---' .----:3:-:4-'

12

114

(A)

Figura 3

12334

12

114

(8 )

123 POPI

34

12_

114

(c)

34

12

114(D)

123

Appunti di informatica

Figura 4

Figura 3 - (A) inserimento di un elemento, (B) stato dello Stack dopo (A), (C) richiesta di POP, (D) Stack dopo (C). Figura 4 - Chiamate nidifieate di subroutine.

che, specialmente quando il nostroprocessore non dispone di istruzioni apiù di un operando: in tale caso, siparla di registro Accumulatore. Spie-ghiamoci meglio: immaginiamo di do-ver sommare il contenuto di due celledi memoria e scrivere il risultato delcalcolo in una terza cella, ad esempio$100 I + $1002 in $1003. Come detto,non possiamo specificare più di unoperando: le -nostre istruzioni riferi-ranno implicitamente al registro accu-mulatore. Scriveremo:

LDA $1001ADD $1002STA $1003

La prima istruzione (LoaD in Acc.) ca-rica nell'accumulatore la cella di me-moria $100 I, la seconda gli somma ilcontenuto della cella $1002 e la terza(STore Acc.) memorizza l'accumulato-re nella cella $1003.

Passiamo allo Stack. Come abbiamogià detto, esso è una struttura dati conpolitica UFO. Tale acronimo sta perLast In First Out che letteralmentevuoI dire: il primo ad entrare è l'ulti-mo ad uscire. Pensate a una pila dipiatti: dovendo aggiungere un piattolo metteremo in cima, così come perprenderne uno prenderemo quello piùin alto: il primo dei piatti posto in pi-la, sarà l'ultimo ad essere usato (semai ci ridurremo ad aver sporcato tuttigli altri). In un calcolatore lo stack(fig. 3) funziona nello stesso modo eserve per parcheggiare momentanea-mente dati che non useremo subito eci servono un po' di registri liberi percompiere nuove operazioni. Infilere-mo i contenuti dei registri nello stackper poi riprenderli a tempo debito.

Esisteranno di conseguenza dueoperazioni, normalmente denominatePUSH e POP, che permettono di met-tere qualcosa nello stack e di ripren-derlo. Facciamo un esempio: ci servo-no liberi i registri r1, r2, r3, scrivere-mo:

PUSH r1PUSH r2PUS H r3

che mettono in «pila» i tre registri nel-l'ordine indicato. Nella fattispecie, incima allo stack c'è l'ex contenuto dir3. Per ripristinare i registri alloro sta-to prima dei PUSH, scriveremo:

POP r3POP r2POP r1

si noti come l'ordine di recupero risul-ta capovolto a causa proprio del fattoche ... «l'ultimo ad entrare sarà il pri-mo ad uscire».

A questo punto una domanda: per-ché politica UFO?

Sembrerebbe infatti che per salvareregistri momentaneamente non servatale convenzione, ed è vero. Si usa U-FO a causa del meccanismo dei sotto-programmi che per natura hanno uncomportamento di questo tipo. In fi-gura 4 è mostrato un programma che aun certo punto chiama la subroutine Iall'interno della quale vi è una chia-mata alla subroutine 2. Immaginiamoallora che nel programma, prima diogni chiamata sottoprogramma si sal-vano sullo stack i tre registri di prima,per poi ripristinarli non appena si ri-torna: ciò avverrebbe, nel nostro esem-pio, in due punti: nel programma prin-cipale, in occasione del JSR I e nellasubroutine I, presso il JSR 2. È ovvioche quando ripristiniamo al ritorno daSub 2, dobbiamo immettere in r1, r2,r3 gli ultimi tre valori da essi denotatie non quelli del programma principa-le, che saranno «ricatturati» a tempodebito: al ritorno da Sub l.

Registri specialiOltre ai registri di uso generale, ogni

CPU possiede almeno altri tre registridi uso più particolare: lo Stack Poin-ter, il Programma Counter e la Proces-sus Status Word. Il primo di questi,come dice il suo nome, serve per im-plementare lo stack in una qualsiasizona di memoria. Infatti, il togli e met-ti di cui sopra, è realizzato dal proces-sore usando un pezzo di memoria co-me stack e un apposito registro che in-dica quale cella di memoria corrispon-

de alla testa di tale struttura dati: qua-le è l'ultimo elemento «push-ato».

Quando faremo un inserimento in-crementeremo lo stack pointer e occu-peremo la cella puntata da questo: di-versamente, per l'operazione di pop,preleveremo l'elemento puntato perpoi decrementare lo stack pointer chepunterà all'elemento precedente. Sem-plice, no?

Il Program Counter, più semplice-mente, contiene l'indirizzo della pros-sima istruzione di macchina da esegui-re: esso è automaticamente incremen-tato dopo aver prelevato l'istruzione eviene modificato dal processore quan-do occorre saltare da un punto all'al-tro del programma in seguito a unGOTa (condizionato e non), GOSUBo RETURN da subroutine. In altre pa-role, il Programm Counter contienecostantemente il prossimo indirizzo dainviare alla memoria per ricevere daquesta la cella contenente l'istruzioneda eseguire.

La Processus Status Word (per sem-plicità PSW, mostrata in fig. 5), riassu-me lo stato del processo in corso perquanto riguarda alcune situazioni. Peresempio, se sommando due numeri ot-teniamo come risultato O il bit marcatoZ si porrà a I. Analogamente se l'ulti-ma operazione effettuata ha dato co-me risultato un numero negativo o vi èstato un overflow aritmetico (la som-ma di due numeri ha superato come ri-sultato la capacità di un registro o diuna cella di memoria) si setteranno ri-spettivamente i bit N o V della PSW.Infine si setterà il bit C se c'è stato unriporto nell'ultima somma o il bit I sec'è stato un Interrupt o altre cose delgenere a seconda del caso.

Insomma, ispezionando la PSW sipuò controllare un po' di roba, even-tualmente prendendo le decisioni delcaso. Infatti le istruzioni di salto con-dizionato non fanno altro che accede-re ai bit della PSW, avendo a secondadi questa un comportamento o un al-tro: ad esempio, col BEQ $2000 vistoprima il processar non fa altro checontrollare il bit Z e se questo è I saltaa $2000 (mettendo $2000 nel pro-

118 MCmicrocomputer n. 54 - luglio/agosto 1986

Page 4: Istruzioni, Registri, Operandi

Appunti di informatica

gramm counter) O procedendo l'elabo-razione se Z = O. Alla stessa manieraavremo istruzioni per saltare se N = Oo N= I (BGTo BNE), se V=O o V= I(BVC o BVS) e se C=O o C= I (BCCo BCS).

Modi di indirizzamentoFinora abbiamo parlato di operandi

di istruzioni senza fare differenza tranumeri, indirizzi di memoria o cosepiù complicate. Tale argomentazioneriguarda i modi di indirizzamento dicui un processore dispone, che ne fan-no per l'appunto una macchina più omeno flessibile e potente. In questa se-de vedremo 7 modi di indirizzare datiche rappresentano il minimo indispen-sabile per non fare salti mortali coi gi-ri e rigiri di una programmazione con-torta.

Il primo modo di indirizzare unoperando di una istruzione è l'indiriz-zamento «immediato»: l'istruzione di-spone subito del suo operando, senz~andarselo a pescare chissaddove. El'esempio tipico, già visto, delle co-stanti. Ad esempio:

ADD 13,33

che esegue la somma del numero 13 edel numero 33. Se invece scriviamo:

ADD $1000, $1001

l'indirizzamento non sarà immediatoin quanto i due operandi dovremo pre-levarli nelle celle $1000 e $1001: inquesto caso si parla di indirizzamentodiretto. L'indirizzamento indiretto, dicontro, prevede un ulteriore livello diricerca dell'operando. Scrivendo:

JMP ($4000)

intendiamo saltare alla cella di memo-ria indicata nella cella $4000. Ciò si-gnifica che per eseguire tale istruzionedobbiamo prima di tutto avere «in ma-no» il $4000, accedere a tale cella, leg-gere il contenuto di essa e finalmenteeffettuare il salto all'indirizzo così ot-tenuto.

Esiste poi l'indirizzamento implici-to, che riguarda istruzioni che implici-tamente si riferiscono a un particolareregistro, ad esempio:

PHAdel microprocessore 6502 (e gentile fa-miglia) inserisce nello stack il conte-nuto dell'accumulatore (detto ancheregistro A).

Per quanto riguarda gli indirizza-menti relativi a insiemi di celle cui fa-re capo all'interno di un loopcon unindice, esistono alcuni modi di indiriz-zamento indiciato. Il primo, indiciatoe basta, si effettua indicando un indi-

rizzo di base più un registro che con-tiene il Displacement, ad esempio:

MOVE $1000+r0,r1

mette nel registro rI il contenuto del1acel1a il cui indirizzo è ottenuto som-mando $1000 e rO. Così se rO vale lOmetteremo in rI il contenuto del1a cel-Ia $1010, se vale 50, la cel1a $1050 ecosì via.

Combinazione dei modi precedentisi hanno con gli indirizzamentì indi-ciato-indiretto e indiretto-indiciato.Anche qui avremo un indirizzo basepiù un registro: nel primo caso l'indi-rizzo è calcolato sommando tra loro labase e il displacement. Facciamo un

Figura 5 - Processus StalUs Word.

esempio, abbiamo:

MOVE ($1000+r0),r1

accediamo come prima alla cel1a1000+ rO, ad esempio la $10 IO, perprelevare l'indirizzo effettivo: suppo-niamo che in $10 IO ci sia il valore2000. La cella $2000 conterrà l'operan-do cercato, che metteremo in rI comeda istruzione.

Nel secondo caso, l'indirizzamentoindiretto-indiciato, si fa prima l'indire-zione e poi si somma l'indice per otte-nere l'indirizzo finale, sia:

MOVE ($1000) +r0,r1

si noti la differenza di posizione delleparentesi rispetto al caso precedente.Supponiamo che rO valga, IO, e la cel-Ia $ I000 contenga 2000. L'indirizzo fi-nale è ottenuto accedendo alla cella$1000, dalla quale otteniamo 2000, aquesto indirizzo sommiamo IO (rO) ot-tenendo $20 IO il cui contenuto saràcopiato in rl.

Assembler e MacroAssembIerOvviamente qualche sforzo è stato

fatto per rendere meno faticosa la pro-grammazione in linguaggio macchina.Il primo passo è stato quello dei nomisimbolici per indicare indirizzi di salto(le etichette) senza stare a contorcersiil cervello con somme e sottrazioniesadecimali per ottenere l'indirizzo ef-fettivo. Si etichetta un punto del pro-gramma con un nome (ad esempiopippo, che è così facile da digitare alterminale) e per saltare lì scriveremoroba del tipo:

JMP PIPPOBNE PIPPO

o similari. Poi è venuta la voìia uci no-mi simbolici anche per le celle cheuseremo nel programma per i calcoli,in parti colar modo per i vettori di cel-le: indichiamo ad esempio con la pa-rola TOP la locazione $1000. Dopoaver preservato da intrusioni le celleseguenti potremo fare accessi del tipo:

MOVE TOP + rO,r1

Il passo successivo è segnato dal1acomparsa delle macroistruzioni defini-bili (da non confondere con le microi-struzioni del prossimo mese) che per-mettono di creare nuove istruzioni apartire da istruzioni più semplici e/oda macro già definite. Se, ad esempio,il nostro processore non dispone diuna istruzione che azzera il contenutodi una cella o di un registro, potrem-mo definirla così:

MACRO CLR MLDA OSTA MendMacro

la prima linea definisce il nome dellanuova operazione e su quanti operan-di agisce, nel nostro caso I. La secon-da e terza linea compongono il corpodella macro e in particolare cosa si de-ve fare una volta ottenuto il parametroM (la cel1a da azzerare): mettiamo inA il numero O e poi scriviamo A nellacella passataci. EndMacro. Da questomomento in poi, potremo considerareCLR come una nuova istruzione dellinguaggio usandola come ci pare, conqualsiasi modo di indirizzamento. Adesempio potremo scrivere:

CLR $1000CLR $1203+rOCLR ($1234)

eccetera. Di fatto, però, non è avvenu-to nulla di strano: semplicemente ]'as-semblatore (che si preoccupa di tra-sformare programmi mnemonici in co-dice eseguibile dal processore) sosti-tuirà ad ogni occorrenza di CLR, la se-quenza di istruzioni specificate nelladichiarazione di Macro, facendo corri-spondere ad ogni parametro formale(la M di cui sopra) il parametro attua-le con cui si invoca l'espansione ma-cro, Nella fattispecie l'assemblatore,ai tre CLR appena mostrati, sostituirà:

LDA OSTA $1000LDA OSTA $1203+rOLDA OSTA ($1234)

che corrisponde (a meno di una inde-gna ridondanza) al programma inistruzioni naturali che azzera le tre cel-le di memoria. Tutto qui.

Ah! dimenticavo: in che cosa consi-ste «l'indegna ridondanza»? Me

MCmicrocomputer n. 54 - luglio/agosto 1986 119