vuoi
o PayPal
tutte le volte che vuoi
RICERCA DI TOKEN IN UNA STRINGA DI CARATTERI E MEMORIZZAZIONE DELL'INDIRIZZO DEI TOKEN TROVATI
Con questo esercizio vogliamo ricercare un determinato token all'interno di una stringa, constatarne la presenza o l'assenza all'interno di essa ed eventualmente scrivere in memoria l'indirizzo in cui il token, che stiamo cercando, è stato registrato. Date le nostre premesse, iniziamo a definire tutto ciò di cui necessitiamo per risolvere il problema. Dunque abbiamo bisogno di: - una variabile che contenga il token che dobbiamo ricercare all'interno della stringa; - una variabile che contenga il token che fungerà da terminatore della stringa; - un array di caratteri su cui effettuare l'operazione; - una variabile che contenga gli indirizzi di memoria degli eventuali token trovati. Questo è ciò che ci occorre tradotto in linguaggio assembler: *Valore del carattere da memorizzare nella variabile TOKEN, il codice operativo usato.è EQU*che permette non solo di memorizzare il valore, ma di renderlo anche costante.
TOKEN ':'EQUTOKEN2 '<'EQU*Definizione tramite il codice operativo di un array di caratteri
DEFINE CONSTANTSTRING 'ab:c:de<'
DC.B*Dichiarazione di spazio non allocato per memorizzare gli indirizzi degli eventuali token trovati*all’interno del programma. In questo caso possiamo registrare al più 4 indirizzi.
TOKENA 4DS.L
START
END
Stabiliti gli elementi sui quali agire e con i quali andare ad operare, dobbiamo implementare il codice. L’algoritmo consterà di tre parti: una prima in cui verranno effettuate tutte le operazioni preliminari (assegnazioni), quindi si passerà alla fase del loop e della ricerca, infine una terza che provvederà all’eventuale memorizzazione dell’indirizzo del token.
Come preannunciato questa sarà la fase in cui ci si preoccuperà di effettuare tutte le assegnazioni utili
Il funzionamento del nostro codice è il seguente:
START
- indica l'inizio del programma
TOKENA
, A1
- utilizzati per memorizzare gli indirizzi di memoria delle variabili nei registri indirizzo
LEA #STRING,A0
- carica l'indirizzo della stringa da cercare nel registro A0
MOVEA.L #TOKEN,D0
- carica l'indirizzo del token trovato nel registro D0
MOVE.B #TOKEN2,D1
- carica l'indirizzo del token2 nel registro D1
Tutte le istruzioni sopra provvedono a trasferire gli indirizzi di memoria in cui sono memorizzate le variabili nei rispettivi registri indirizzo.
In vi
verrà registrato l'indirizzo del token trovato, in vi
è la stringa su cui effettuare la ricerca, in vi
è il carattere da ricercare, infine in c
è il carattere terminatore della stringa.
TOKEN
e TOKEN2
sono variabili che contengono gli indirizzi di memoria.
Domanda - I primi tre codici operativi sembrano essere diversi tra di loro. Perché ognuno di essi produce un'azione che in sostanza è uguale a quelle delle altre due?
Il codice operativo LEA
è l'acronimo di "load effective address" e ha la funzione di prelevare l'indirizzo effettivo della variabile e di porlo nel registro indirizzi. La seconda istruzione MOVEA
carica l'indirizzo di TOKENA
dopo averlo reso costante.
I primi due codici operativi, per questo utilizzo, sono totalmente equivalenti. Avremmo infatti potuto scrivere indifferentemente:
#TOKENA,A1MOVEA.L
oppure
STRING,A0LEA
proprio in virtù di questa uguaglianza. Ma anche la terza istruzione ha lo scopo di prendere l’indirizzo di e di TOKEN porlo in un registro, la differenza sta nel fatto che i primi due avevano come destinazione un registro indirizzi, questa istruzione ha come destinazione un registro dati. Dunque nella seconda istruzione occorre usare (move MOVEA address), nella terza MOVE.LOOP
In questo secondo passaggio dobbiamo preoccuparci dello sviluppo del codice che verrà utilizzato per i confronti dei caratteri e in particolare per il riconoscimento del token. Il primo problema è determinato dal raffronto. Deve avvenire, infatti, tra i vari elementi della stringa e i due caratteri che abbiamo definito all’inizio, vale a dire i due punti : e il minore <. Il primo è l’elemento di cui
dobbiamo verificare la presenza ed eventualmente l'indirizzo, il secondo è ilterminatore della stringa. Il ragionamento da fare è: prendiamo il primo indirizzo di memoria della stringa econfrontiamo il primo carattere con il primo token e poi con il secondo. Se è uguale ad uno di questi, si procede con lafase finale, altrimenti incrementiamo l'indirizzo di memoria della stringa ed effettuiamo un altro confronto.
*compara il contenuto di A0 con il contenuto di D0, quindi incrementa A0
LOOP (A0)+,D0
CMP.B
*se i due elementi sono uguali, passa a FOUND
FOUNDBEQ
*altrimenti compara A0 con D1