Programma in assembler
Salve a tutti dovrei risolvere questo esercizio in linguaggio assembler.
Calcolare alcune statistiche sulle cifre decimali presenti in una stringa di caratteri alfanumerici. Ciascuna cifra decimale (0, 1, ..., 9) può essere presente nella stringa al più una volta. Tutti i caratteri della stringa, comprese le cifre decimali, sono codificati secondo il codice ASCII (ogni carattere occupa 1 byte). La stringa è già presente in memoria a partire dalla locazione il cui indirizzo è contenuto nel registro R0. Il carattere terminatore della stringa è lasciato alla scelta del candidato.
Il programma deve restituire:
nel registro R1 il numero di cifre decimali (da 0 a 9) presenti nella stringa
nel registro R2 la cifra decimale più alta contenuta nella stringa
nel registro R3 la cifra decimale più bassa contenuta nella stringa
Si ricorda che nel codice ASCII le cifre decimali sono tutte consecutive; alla cifra 0 corrisponde 30 in esadecimale.
Io non sono riuscita a risolverlo ma ho scritto qualcosa di questo tipo.
Mi sono bloccata nella parte centrale dell esercizio
NUM: db 0 // qui memorizzo in seguito il numero di cifre decimali presenti nella stringa
MAX: db 0 // qui memorizzo la cifra decimale più alta contenuta nella stringa
MIN: db 0 // memorizzo la cifra decimale più bassa
START: MOV R0 R11 // copio l indirizzo contenuto in r0 in r11 // il carattere di terminazione vorrei fosse '$'
CICLO:
JUMP PJ
JUMP PK
JUMP PL
PJ: MOV NUM R1 // copio il numero di cifre decimali in R1
PK: MOV MAX R2 // copio la cifra decimale più alta in R2
PL: MOV MIN R3 // copio la cifra dec min in R3
Calcolare alcune statistiche sulle cifre decimali presenti in una stringa di caratteri alfanumerici. Ciascuna cifra decimale (0, 1, ..., 9) può essere presente nella stringa al più una volta. Tutti i caratteri della stringa, comprese le cifre decimali, sono codificati secondo il codice ASCII (ogni carattere occupa 1 byte). La stringa è già presente in memoria a partire dalla locazione il cui indirizzo è contenuto nel registro R0. Il carattere terminatore della stringa è lasciato alla scelta del candidato.
Il programma deve restituire:
nel registro R1 il numero di cifre decimali (da 0 a 9) presenti nella stringa
nel registro R2 la cifra decimale più alta contenuta nella stringa
nel registro R3 la cifra decimale più bassa contenuta nella stringa
Si ricorda che nel codice ASCII le cifre decimali sono tutte consecutive; alla cifra 0 corrisponde 30 in esadecimale.
Io non sono riuscita a risolverlo ma ho scritto qualcosa di questo tipo.
Mi sono bloccata nella parte centrale dell esercizio
NUM: db 0 // qui memorizzo in seguito il numero di cifre decimali presenti nella stringa
MAX: db 0 // qui memorizzo la cifra decimale più alta contenuta nella stringa
MIN: db 0 // memorizzo la cifra decimale più bassa
START: MOV R0 R11 // copio l indirizzo contenuto in r0 in r11 // il carattere di terminazione vorrei fosse '$'
CICLO:
JUMP PJ
JUMP PK
JUMP PL
PJ: MOV NUM R1 // copio il numero di cifre decimali in R1
PK: MOV MAX R2 // copio la cifra decimale più alta in R2
PL: MOV MIN R3 // copio la cifra dec min in R3
Risposte
In generale il codice che devi scrivere corrisponde a questo pseudocodice:
Hai qualche dubbio?
- Copia R0 in R11 - Inizializza NUM, MAX e MIN con valori opportuni LOOP: Memorizza il byte all'indirizzo R11 in qualche registro (per esempio R12) - Confronta R12 con '$' - Se è uguale salta al punto END - Confronta R12 con MAX - Se è minore salta al punto MINCOMP - Scrivi R12 in MAX MINCOMP: Confronta R12 con MIN - Se è maggiore salta al punto INC - Scrivi R12 in MAX INC: Incrementa R11 - Vai a LOOP - Scrivi (R11 - R0) in NUM (o direttamente R1) - Scrivi MIN e MAX in R2 e R3
Hai qualche dubbio?
il mio dubbio è il seguente… come faccio a confrontare R12 con max?
perche mentre in c facevo una semplice cmp qui è un po' diverso.
perché nella tabella di assembly che mi è stata data all università non è prevista la cmp per il confronto
perche mentre in c facevo una semplice cmp qui è un po' diverso.
perché nella tabella di assembly che mi è stata data all università non è prevista la cmp per il confronto
Quale linguaggio assembly stai usando? Le istruzioni dipendono dall'architettura e dall'assemblatore usando.
questa è l unica tabella che possiamo usare all'esame
https://imageshack.com/i/f04H863vj
quindi altre istruzioni nn possiamo usarne
https://imageshack.com/i/f04H863vj
quindi altre istruzioni nn possiamo usarne
Senza sapere l'architettura e l'assemblatore che stai usando è difficile aiutarti oltre allo pseudocodice (come ti hanno già suggerito)..
Non sono sicuro di comprendere cosa vogliano dire tutte le colonne di quella tabella. Ma in ogni caso puoi usare SUB seguita da JMPNN per fare il confronto (e il successivo salto).
c'è scritto assembler simCPU
A quanto pare si tratta di una assembler creato apposta per scopi educativi e non corrisponde ad alcuna ISA reale. Il mio consiglio è comunque sempre valido. JMPxx ti forniscono dei saldi condizionali basati sul confronto con il valore zero. Puoi quindi usare il fatto che R12 < MAX => R12 - MAX < 0 oppure MAX - R12 > 0.
ok ti ringrazio
