Programma in assembler

luaneddra1989
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

Risposte
apatriarca
In generale il codice che devi scrivere corrisponde a questo pseudocodice:
- 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?

luaneddra1989
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

apatriarca
Quale linguaggio assembly stai usando? Le istruzioni dipendono dall'architettura e dall'assemblatore usando.

luaneddra1989
questa è l unica tabella che possiamo usare all'esame
https://imageshack.com/i/f04H863vj

quindi altre istruzioni nn possiamo usarne

Cronovirus
Senza sapere l'architettura e l'assemblatore che stai usando è difficile aiutarti oltre allo pseudocodice (come ti hanno già suggerito)..

apatriarca
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).

luaneddra1989
c'è scritto assembler simCPU

apatriarca
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.

luaneddra1989
ok ti ringrazio :)

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