[Assembler] Copiare una stringa

minavagante1
ciao a tutti,
mi trovo di fronte al seguente programma:devo copiare una stringa il cui indirizzo è passato nel registro R1 e la devo copiare nell'indirizzo contenuto nel registro R2. La soluzione è la seguente:
START:  LDBR R10 R1
        STBR R10 R2
        JMPZ END
        INC R1
        INC R2
        JMP START
END:      RET

ove le istruzioni sono così definite:
LDBR d a, è l'istruzione load byte e quell'R finale indica che l'indirizzo del dato è contenuto nel registro specificato in a, e d è la destinazione.
STBR s a, store byte.
Non riesco a capire le storie sugli indirizzi, se io ho in R1 l'indirzzo della stringa, come faccio a copiare la stringa senza nemmeno considerare i valori???
Grazie a tutti

Risposte
minavagante1
Sergio non so come ringraziarti, davvero un'ottima spiegazione :D :D
Il mio dubbio derivava dal fatto che se appunto scrivo LDBR non sapevo quale valore veniva caricato, se l'indirizzo o il valore stesso.
Faccio altre domande se non ti dispiace :-D
Allora sempre riguardo al caricamento load, che con l'assemblatore che utilizziamo, consete 3 di queste istruzioni:
LDBI, indirizzamento diretto, praticamente quando devo inserire direttamente in un registro una costante
LDBA, indirizzo assoluto, la parola che segue l'istruzione contiene l'indirizzo del dato
LDBR, quello già utilizzato prima
Allora per il primo lo si usa sempre quando devo scrivere una cosa del genere LDBI R0 10 giusto??
Il secondo, LDBA d A, dove A rappresenta il valore di un numero. Quindi il secondo sarà sempre un indirizzo. E se io scrivo una cosa del genere:
LDBA R1 R2 e magari R2 ad esempio contiene il numero 3, cosa succede, in R1 viene messo l'indrizzo di R2 oppure non è consentita una scrittura del genere???

minavagante1
Ah ah anche tu motociclista?? :D
Si quello è il mio professore di info 2 :-D
stavo giusto guardando questo tema qui:
http://web.diegm.uniud.it/pierluca/publ ... 41209r.pdf
l'esericizio 4, nel quale si vuole scambiare il contenute di due stringhe i cui indirizzi sono contenuti rispettivamente in R1 ed R2, e considerando che dalla locazione EE00 ci sia spazio sufficiente per memorizzare una stringa temporaneamente.
I comandi di push e di pop nello stack servono sostanzialemente a salvare le variaibili locali giusto?? Quindi il programma inizia facendo subito un push per gli indirizzi delle due stringhe, e poi viene fatta una chiamata alla funzione che copia la stringa. Prima di chiamare la funzione con LDWA R2 TEMP in R2 viene salvato l'indirizzo EE00. Quindi a questo punto, prima della chiamata, R1 vale l'indirizzo della prima stringa, R2 vale EE00 giusto??
Passiamo alla funzione: con la prima istruzione carico in R10 il primo elemento della prima stringa. Con STBR memorizzo il primo elemento della prima stringa nella locazione EE00 (indirizzo contenuto in R2), poi eventualemente se è nullo ritorno al programma principale, altriemnti incremento gli indirzzi contenuti rispettivcamente in R1 ed R2.
Al termine della funzione,ritorno al programma principale con la stringa 1 salvata nelle "celle temporanee".
Ora viene fatto il pop dallo stack, cosa succede??? In R1 ci sarà sempre l'indirizzo della stringa 1, ma in R2 cosa ci sarà??? Siccome avevo fatto il push prima di carica in R2 l'indirizzo EE00, ora facendo il pop in R2 ho l'indirizzo della stringa 2 oppure EE00???

minavagante1
Aaaaaahh, non male quello scherzetto di fare il push di un registro e "popparlo" con un altro in modo da scambiarne i valori. Difatti non riuscivo a capire perchè ci fosse il push in un certo ordine e la "pila" dello stack non venise rispettata :? Ora è chiaro grazie mille...
Approfitto della tua disponibilità e conoscenza anche per questo esercizio: :-D
http://web.diegm.uniud.it/pierluca/publ ... 70328r.pdf
il quarto esercizio, il programma che fa la divisione tra 10 e 3 in modo recursivo. Quel jump mi frega :?
Allora la risoluzione dell'esercizio mi è chiaro, ma come avvengono le istruzione non motlo. Nel senso: rapporto 10/3, praticamente in modo recursivo vede quante volte il 3 sta nel dieci sottraendo quest'ultimo a 10 cicilicamente. Allora parte il programma:
10-3=7 richiama la funzione DIVR (ho un ret di cui tenere conto)
7-3=4 richiama la funzione DIVR (ho due ret di cui tenere conto)
4-3=1 richiama la funzione DIVR (ho 3 ret di cui tenere conto)
1-3=-2 negativo si salta a RET0 che inizializza R0=0
Fin qui tutto ok, ora arriva il problema!! Ora il programma ritorna all'istruzione di INC R0, ma perchè?? Perchè ho quei tre RET di cui "tener conto"?? Nel senso, un JUMP normale poi continua con le istruzioni successive giusto?? Qui torno a INC perchè per tre volte non sono ritornato alla funzione???
Grazie

minavagante1
Grazie mille di tutto, avrò ancora molte domande presumo :-D

minavagante1
Non mi sono fatto aspettare molto :-D :-D
volevo chiedere una cosa riguardo all'esercizio 4 di questo tema:
http://web.diegm.uniud.it/pierluca/publ ... 60922r.pdf
la STRNCMP controlla solo se i primi N elementi delle due stringhe sono uguali no??
Non se ad esempio ho queste stinghe con N=4
S1=ciao\0
S2=gianniciao\0
qui ritorna sempre che non sono uguali no?

minavagante1
perfetto...La funzione STRNCMP del c mi sembra conforntasse anche stringhe interne oppure mi sbaglio???

minavagante1
capito, graize mille

minavagante1
Ciao,
riprendo questo topic per chiedere se questa versione del programma in assembler per scambiare il contenuto di due stringhe S1 ed S2 i cui indirizzi sono rispettivamente memorizzati in R1 ed R2 possa andare bene. Dall'indirizzo EE00 c'è spazio sufficinete per una stringa temporanea.
TEMP_ADD:   word EE00
START:      PUSH R1
            PUSH R2
            LDWA R11 TEMP_ADD
            LDWA R10 R1
            CALL STRCPY
            LDWA R10 R2
            LDWA R11 R1
            CALL STRCPY
            LDWA R10 TEMP_ADD
            LDWA R11 R1
            CALL STRCPY
            HLT


STRCPY:     LDWR R12 R10
            STBR R12 R11
            JMPZ END_STRCPY
            INC R10
            INC R11
            JUMP STRCPY
END_STRCPY: RET


Grazie

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.