[Assembler] Copiare una stringa
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:
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
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
Sergio non so come ringraziarti, davvero un'ottima spiegazione
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
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???


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

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???
Ah ah anche tu motociclista??
Si quello è il mio professore di info 2
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???

Si quello è il mio professore di info 2

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???
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:
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

Approfitto della tua disponibilità e conoscenza anche per questo esercizio:

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
Grazie mille di tutto, avrò ancora molte domande presumo

Non mi sono fatto aspettare molto
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?


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?
perfetto...La funzione STRNCMP del c mi sembra conforntasse anche stringhe interne oppure mi sbaglio???
capito, graize mille
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.
Grazie
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