vuoi
o PayPal
tutte le volte che vuoi
RICERCA DI TOKEN IN UNA STRINGA DI CARATTERI
Lo scopo di quest'esercizio è quello di ricercare un token all'interno di una sequenza di caratteri. Se il token è presente, allora memorizzare in una variabile l'indirizzo del registro in cui è presente il token; se il token non è presente, terminare il ciclo ed uscire dal programma.
Per prima cosa occorre definire tutto il necessario per costruire il nostro algoritmo in assembler. Guardando alle ipotesi dell'esercizio c'è necessità di avere:
- una variabile che contenga il carattere che dobbiamo ricercare all'interno della stringa;
- una variabile che contenga il carattere che fungerà da terminatore della stringa;
- una stringa su cui effettuare la ricerca;
- una variabile in cui memorizzare l'indirizzo del nostro token.
Ecco allora ciò di cui abbiamo bisogno tradotto in assembler:
$8100 ORG *Assegnazione tramite il codice operativo del valorerappresentante il carattere : alla EQU variabile TOKEN TOKEN ‘:’ EQU ‘<’*Definizione tramite il codice operativo di un array di caratteriDEFINE CONSTANTSTRING ‘ab:cd’DC.B*Definizione di una variabile non inizializzata delle dimensioni di una longword di nomeTOKENATOKENA 1DS.LUna volta definito tutto il necessario per lavorare sulla stringa, passiamo a progettare quale sarà il comportamento delnostro algoritmo. Date le premesse, si potrebbe pensare che il nostro algoritmo si possa suddividere in tre fasi: start,ciclo di confronti ed esito, che contrassegneremo opportunamente con delle label. Nella prima fase faremo tutte leassegnazioni utili all’algoritmo, nella seconda verrà implementato il vero e proprio ciclo di confronti, che permetterà ladeterminazione della presenza o dell’assenza del token richiesto, infine un’ultima fase che ci restituirà, a patto che ilcarattere che cerchiamo siaall'interno della stringa, l'indirizzo in cui è memorizzato.
STARTIn questa fase ci preoccuperemo di assegnare i valori utili al nostro algoritmo in opportune variabili. E dunque:
START #STRING,A0
MOVEA.L #TOKEN,D0
MOVE.B #TOKEN2,D1
Con la prima istruzione viene prelevato l'indirizzo della variabile reso costante tramite e infine copiato STRING
, all'interno del registro. Con la seconda istruzione avviene in modo del tutto analogo la copia dell'indirizzo della variabile A0
all'interno del registro dopo essere stato reso costante. Idem, per la terza istruzione.
Domanda - I codici operativi della prima e della seconda istruzione sembrano diversi, perché hanno lo stesso effetto?
Nel primo caso l'indirizzo della variabile viene mosso all'interno di un registro indirizzi, invece nel secondo caso l'indirizzo della variabile viene copiato all'interno di un registro dati. Pertanto nel primo caso occorre
usare ilTOKEN(move address), nel secondo un sempliceMOVEA MOVE.CICLO DI CONFRONTIA questo punto deve avvenire il confronto tra i vari elementi della stringa e i due caratteri che abbiamo definitoall’inizio, vale a dire i due punti : e il minore <. Il primo è l’elemento di cui dobbiamo verificare la presenza edeventualmente l’indirizzo, il secondo è il terminatore della stringa. Il ragionamento da fare è: prendiamo il primoindirizzo di memoria della stringa e confrontiamo il primo carattere con il primo token e poi con il secondo. Se è ugualead uno di questi, si procede con la fase finale, altrimenti incrementiamo l’indirizzo di memoria della stringa edeffettuiamo un altro confronto. Traducendo in linguaggio assembler abbiamo:
LOOP (A0)+,D0
CMP.B (A0),D1
CMP.B LOOP
BNE
Con la prima istruzione prendiamo il contenuto di (vale a dire l’indirizzo di memoria della stringa, dove vi èA0memorizzato il valore della stringa, a cui punta),
lo compariamo con (contenente la rappresentazione numericaA0 D0dei due punti) ed incrementiamo il valore dell'indirizzo di memoria della stringa. Con la seconda istruzione prendiamo ilcontenuto di e lo compariamo con Se una delle due condizioni è soddisfatta, si esce dal ciclo tramite la terzaA0 D1.istruzione e si procede con l'ultima fase.
ESITO
L'ultima fase consisterà unicamente nel ricopiare il valore del token all'interno del registro finale. Se non vi è ilTOKENA.token all'interno della stringa il valore della memoria rimarrà inalterato e dunque pari a zero.