ASM [8086] Bloccato in un piccolo esercizio

Stato
Discussione chiusa ad ulteriori risposte.

RayperZ

Utente Emerald
23 Dicembre 2011
679
49
155
384
Il professore ci ha assegnato un'esercizio da fare, il seguente esercizio consiste nel:
Chiedere in input una cifra numerica, trasformarla in numero, moltiplicarla per 10, aggiungere un secondo numero chiesto in input (sempre trasformandolo da cifra numerica) e in fine mostrare in output questa somma.

Ora il mio problema è: Come faccio a fare l'output di questo numero?
Ho scritto al momento questo codice:
Codice:
org 100h
MOV AH, 1
INT 21h
SUB AL, 48
MOV BL, 10
MUL BL
MOV BX, AX
MOV AH, 1
INT 21h
SUB AL, 48
CBW                    
ADD AX, BX
ret

Facendo varie prove, tipo primo input 5, secondo input 3, mi esce fuori 35 ovviamente in Hex, ciò vuol dire 53 in Dec, quindi funziona, il problema arriva qui: Come faccio a fare l'output di questo numero? E' un registro a 16 Bit dato che si trova in AX, e:
Codice:
MOV AH, 2
INT 21h
Prende il valore da mostrare in output da DL che è un registro a 8 bit, e non so se posso convertire il numero, quindi chiedo aiuto a voi su come risolvere questo problema.
Spero mi possiate aiutare :asd:

USO EMU8086
 
Insomma il problema è che vuoi stampare un numero a 16 bit contenuto in AX ma DL ne contiene solo 8?
Il fatto è che in DL non devi inserirci il numero, ma il valore ASCII corrispondente al carattere che vuoi stampare:
mettiamo che AX contenga il numero 321. Per stampare questo numero devi eseguire tre stampe successive (ci vuole quindi anche un loop): alla prima stampi 3, alla seconda 2, alla terza 1. Quindi, una volta che hai il valore da stampare in AX, devi:
1. decomporre il numero prendendo la prima cifra decimale/esadecimale;
2. convertirla in ASCII;
3. metterla in DL;
4. chiamare INT 21h AH=02h per stampare il contenuto di DL;
5. ritornare al punto 1 fino a che le cifre da stampare non sono finite.

Se va bene stampare in esadecimale, farlo è semplice. In decimale è leggermente più complesso ma comunque facile.
Faccio un esempio per capire l'algoritmo che devi applicare per stampare in esadecimale:
Mettiamo che hai:
AX=0001010111000011 (5571 decimale; 15C3 esadecimale).
Prendi il primo nibble (4 bit): 0001. Essa è la prima cifra esadecimale da stampare (15C3).
Prendi il secondo nibble: 0101. Essa è la seconda cifra da stampare (15C3).
Terzo nibble: 1100 -> terza cifra (15C3) - infatti C = 12 decimale = 1100 binario.
Quarto nibble: 0011 -> quarta cifra (15C3).
Per "estrarre" questi nibble vengono i aiuto gli shift.
Ovviamente prima di stampare ogni cifra dovrai convertirla nel corrispondente codice ASCII. Nel caso la cifra da stampare è minore di 10 (0...9) allora è semplice: devi semplicemente sommarci 48 decimale e stampare. Se invece è maggiore di 10 (A...F) è altrettanto semplice ma devi stampare una lettera: devi quindi sommarci 65 decimale invece di 48.
 
Insomma il problema è che vuoi stampare un numero a 16 bit contenuto in AX ma DL ne contiene solo 8?
Il fatto è che in DL non devi inserirci il numero, ma il valore ASCII corrispondente al carattere che vuoi stampare:
mettiamo che AX contenga il numero 321. Per stampare questo numero devi eseguire tre stampe successive (ci vuole quindi anche un loop): alla prima stampi 3, alla seconda 2, alla terza 1. Quindi, una volta che hai il valore da stampare in AX, devi:
1. decomporre il numero prendendo la prima cifra decimale/esadecimale;
2. convertirla in ASCII;
3. metterla in DL;
4. chiamare INT 21h AH=02h per stampare il contenuto di DL;
5. ritornare al punto 1 fino a che le cifre da stampare non sono finite.

Se va bene stampare in esadecimale, farlo è semplice. In decimale è leggermente più complesso ma comunque facile.
Faccio un esempio per capire l'algoritmo che devi applicare per stampare in esadecimale:
Mettiamo che hai:
AX=0001010111000011 (5571 decimale; 15C3 esadecimale).
Prendi il primo nibble (4 bit): 0001. Essa è la prima cifra esadecimale da stampare (15C3).
Prendi il secondo nibble: 0101. Essa è la seconda cifra da stampare (15C3).
Terzo nibble: 1100 -> terza cifra (15C3) - infatti C = 12 decimale = 1100 binario.
Quarto nibble: 0011 -> quarta cifra (15C3).
Per "estrarre" questi nibble vengono i aiuto gli shift.
Ovviamente prima di stampare ogni cifra dovrai convertirla nel corrispondente codice ASCII. Nel caso la cifra da stampare è minore di 10 (0...9) allora è semplice: devi semplicemente sommarci 48 decimale e stampare. Se invece è maggiore di 10 (A...F) è altrettanto semplice ma devi stampare una lettera: devi quindi sommarci 65 decimale invece di 48.
Grazie mille per la risposta Speed, ma non penso ci sia una via più semplice, d'altronde siamo ancora all'inizio dell'asm e di fatti non abbiamo ancora fatto gli shift, cicli, if e così via. (Non metto in dubbio la tua preparazione, prima che mi spari :asd:)
Quindi non posso far stampare il valore NON ASCII situato nel registro AX o DL?

(Vedendo un po il risultato situato nei registri sono riuscito a capire che in ogni caso va a scrivere solo sul 1° registro, quindi se trasferisco AX in DL per fare l'output con MOV AH, 2 INT 21h riesco a far mostrare in output il carattere ASCII corrispondente al numero decimale.)

Domani caso mai chiedo spiegazioni al professore se non dovessi trovare una risposta a questa domanda. :\
 
Quindi non posso far stampare il valore NON ASCII situato nel registro AX o DL?
Sì puoi anche stampare il valore non-ascii ma quello che ti verrebbe in output sarebbe un risultato probabilmente non accettabile. Cioè se prendi come primo input 4 e come secondo input 8 viene: 4*10+8 = 48. Se poi provi a stamparlo semplicemente mettendolo in DL e chiamando la INT 21h ti viene stampato "0" (che è il carattere ASCII corrispondente al decimale 48) e non "48" (per stampare 48 devi stampare 2 volte: prima l'ASCII corrispondente al carattere 4, poi l'ASCII corrispondente al carattere 8).
 
Sì puoi anche stampare il valore non-ascii ma quello che ti verrebbe in output sarebbe un risultato probabilmente non accettabile. Cioè se prendi come primo input 4 e come secondo input 8 viene: 4*10+8 = 48. Se poi provi a stamparlo semplicemente mettendolo in DL e chiamando la INT 21h ti viene stampato "0" (che è il carattere ASCII corrispondente al decimale 48) e non "48" (per stampare 48 devi stampare 2 volte: prima l'ASCII corrispondente al carattere 4, poi l'ASCII corrispondente al carattere 8).
Va bene, grazie mille per le tue risposte, ora provo a fare un piccolo ciclo e vedo che mi esce fuori. :)
 
[
uploadfromtaptalk1458943187263.jpg

Guarda questo programma lo ho fatto io a scuola guarda la parte finale per output dovrebbe funzionare

Inviato dal mio ONE A2003 utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.