PDA

Visualizza la versione completa : [ASSEMBLER] - conteggio numeri


patoufle
13-07-2012, 15:09
devo fare un programma che mi chieda in input due numeri ( con al massimo 5 cifre ), che mi faccia il conteggio delle volte che il numero '1' stato ripetuto dai numeri tra a e b ( compresi ), e mi faccia la somma di questi ultimi.

per esempio , scegliendo i numeri a=122 e b=125, allora la sequenza ( di cui non richiesta la stampa ) da prendere in considerazione : 122, 123 , 124 , 125. in questa sequenza il numero 1 stato ripetuto in totale 4 volte. quindi la somma di tutti gli "1" presenti nella sequenza proprio 4.

un esercizio praticamente identico gi stato affrontato in precedenza, ma l'utente in questione aveva , se posso permettermi , molta pi voglia di farsi fare un esame che di imparare.. io ho svolto la parte relativa alla introduzione dei numeri da tastiera, e so come risolvere il terzo punto relativo alla somma totale dei numeri 1. avrei per bisogno di una mano per risolvere il punto intermedio del mio esercizio, quello relativo al conteggio della frequenza del numero 1 nella sequenza di numeri. potreste darmi una mano ?

ovviamente sono pronto a fornire , se richiesto, il codice da me scritto per l'introduzione dei numeri da tastiera, e ad esporvi le mie idee per la realizzazione del punto intermedio che non riesco a risolvere.

grazie

oregon
13-07-2012, 15:51
Comincia con l'indicare di quale assembler parli e poi mostra codice e idea ...

patoufle
13-07-2012, 16:11
utilizziamo assembler x86, compilatore dosbox.

ho avuto un milione di idee, mi perdonerai se alcune sono stupide ma sono solo all'inizio. di getto , guardando il programma, ho pensato che potevo Trasformare in numeri le cifre scritte in input (utilizzando per 16 bit). in questo modo avrei dunque trasformato una sequenza con blocchi di massimo 5 cifre, in una sequenza con un blocco per volta. quindi sarei potuto partire da A , fino ad arrivare a B, e avrei cos potuto scorrere UNA CIFRA PER VOLTA. se il blocco ( cifra ) uguale a 1, allora incremento il contatore, altrimenti passo al blocco successivo. Appena arrivo a B (ultimo blocco) e l'ho controllato moltiplico 2 * variabile e scrivo il risultato...

oregon
13-07-2012, 16:32
Cosa usi per l'input dei dati da tastiera? Mostra solo questa parte di codice ...

patoufle
13-07-2012, 18:43
questo il codice che ho scritto per l'introduzione dei numeri da tastiera. dovevano essere compresi da 0 a 64000. il tipo di "struttura" che ho utilizzato quella tipica voluta dal nostro professore.

purtroppo ho dovuto caricarla su mediafire, mi dispiace ma era troppo lunga e non mi era possibile postarla. http://www.mediafire.com/?6vtjfr91p9zqg3d

so che in molti forum vietato postare link di mediafire, e devo ammettere che non ho letto abbastanza bene le condizioni al momento dell'iscrizione. se mi dite come posso ovviare al problema, modifico il post subito.

oregon
13-07-2012, 19:01
dosbox un emulatore ... ma per assemblare cosa usate? MASM ? O altro ?

patoufle
13-07-2012, 19:10
‐ Un editor di testo: notepad, pspad, gedit, textedit, ...
-_‐ Un ambiente x86: DOSBOX
-_‐ Un compilatore assembler: Turbo Assembler
-_‐ Un linker assembler: Turbo Linker
-_‐ Un debugger: Turbo Debugger

come assemblatore usiamo tasm

oregon
13-07-2012, 19:31
Ah ... ecco ... io ho installato MASM ma lo stesso.

Ho visto il codice e ho visto che esegui l'input ASCII in un buffer del primo numero, lo converti in binario e poi ripeti le due operazioni per il secondo numero.

A parte che ti conviene impostare una routine per la conversione da ASCII a binario e chiamarla due volte durante l'input invece di scrivere due volte lo stesso codice, a questo punto hai due strade da poter seguire.

La prima :

1) Azzeri un contatore di '1' (magari in un registro a 8 bit)

2) imposti un ciclo con un contatore che parta dal primo valore binario e termini al secondo (utilizzi un registro a 16 bit come SI per contare)

3) scrivi una funzione che trasformi il valore di SI in ASCII e, mentre converti, controlli che il carattere convertito sia un '1' ... in questo caso aumenti il contatore

La seconda :

1) Azzeri un contatore di '1' (magari in un registro a 8 bit)

2) Effettui soltanto l'input dei valori in ASCII in due buffer diversi (buffer1 e buffer2) e non trasformi in binario i valori (non usi NUM1 n NUM2)

3) Conti le cifre '1' nel buffer1 aggiornando il contatore

4) Aumenti il valore di buffer1 di 1 seguendo le regole della numerazione decimale tenendo conto che utilizzi valori ASCII e ripeti il punto 3) finch i due buffer non si equivalgono

patoufle
15-07-2012, 19:19
ti allego , scusa per la scrittura a zampe di gallina, uno "schema" di come risolverei l'esercizio, per quello che secondo me potrebbe essere il modo pi semplice (http://www.mediafire.com/?ob65kdzom6ag57z ). il professore mi aveva consigliato di scrivere prima il codice in c, cosa che ho fatto qui :


#include <stdio.h>
#define LIM_INF 0
#define LIM_SUP 64000
#define TARGET_DIGIT 2

int main(void) {
int A, B;
int contatore, curr;

//controllo dell'input
do { //ciclo che controlla se A < B
do { //ciclo che controlla se LIM_INF <= A <= LIM_SUP
printf("Inserisci estremo inferiore: ");
scanf("%d", &A);
} while (A < LIM_INF | A > LIM_SUP);

do { //ciclo che controlla se LIM_INF <= B <= LIM_SUP
printf("Inserisci estremo superiore: ");
scanf("%d", &B);
} while (B < LIM_INF || B > LIM_SUP);
} while (A > B);

for (contatore = 0; A <= B; A++)
//scompone il numero in cifre e cerca la cifra bersaglio (2 in questo caso)
for (curr = A; curr > 0; curr /= 10)
//ottengo cifra meno significativa e faccio quel che devo fare
if (curr % 10 == TARGET_DIGIT)
contatore++;

printf("Sono stati trovati %d cifre uguali a %d\n", contatore, TARGET_DIGIT);
printf("La somma delle %d occorrenze di %d e' %d\n", contatore, TARGET_DIGIT, TARGET_DIGIT * contatore);
return 0;
}

Loading