|
 |
Raccolta di Procedure ASM |
Dec2Byt
[26 di 54] |
|
|
 |
Aggiornato 13
febbraio 2007 |
 | Converte
fino a 2 caratteri ASCII decimali nel
numero binario a 8 bit che corrisponde loro. |
 | La Procedura
si chiama in questo modo: |
 | In
ingresso bisogna predisporre:
 | SI
con l'indirizzo di Offset della locazione che contiene il primo dei
caratteri Ascii della stringa da
convertire. |
 | la stringa da
convertire
deve essere predisposta dal programma
che chiama questa procedura nella
sua
area destinata ai dati del programma con l'aiuto di un'etichetta,
scelta a piacere dal programmatore, e della
pseudooperazione DB |
 | la stringa da
convertire
deve
essere strutturata nel modo indicato dalla figura,
rigorosamente con 2 caratteri solo Ascii numerici
(non necessariamente inizializzati a '0')
e
terminata con il byte 00H:
|
|
 | In uscita lascia:
 | AL
con il numero esadecimale a 8 bit
corrispondente ai 2 carattere Ascii della stringa
da convertire |
 |
se la stringa è vuota (cioè se
contiene solo il terminatore
00H)
la procedura termina immediatamente con
AL=00H |
 |
se la stringa contiene più di 2 caratteri
la procedura termina subito e lascia in uscita
AL=FFH,
utile per esercitare un eventuale controllo
d'errore dopo la sua chiamata |
|
 | La seguente Area di Testo
mostra il Modulo varie13 utilizzato per
inserire la Procedura
nella Libreria
Giobe.ASM/LIB: |
|
Dec2Byt / varie13 |
NB: se il testo contenuto nell'Area
ti
sembra strano (cioè se contiene
caratteri inconsueti) non hai ancora
installato il font
Giobe.TTF
:
clicca qui!! |
 | L'analisi del codice
mette in evidenza la seguente sequenza di operazioni:
 | calcola (in CX) l'effettivo
numero di caratteri numerici presenti nella
stringa da convertire, puntata da CS:SI
e terminata dal carattere 00H |
 | predispone in AL il
valore FFH e pone termine alla procedura
se la stringa contiene più di 2 caratteri |
 | predispone in AL il
valore 00H e pone termine alla procedura
se la stringa è vuota (cioè se contiene
solo il terminatore 00H) |
 | in tutti gli altri casi assume il
primo byte sotto test
dalla stringa (MOV AL,CS:[SI]),
certamente del tipo 30H÷39H,
essendo corrispondente ad un ascii numerico,
'0'÷'9';
basta ora sottrargli 30H (SUB
AL,'0') per convertirlo nel valore desiderato,
00H÷09H |
 |
nonostante la richiesta
predisposizione con 2 caratteri, la stringa
potrebbe essere composta anche da 1 solo
carattere; se viene rilevata questa situazione (CMP CX,0001H)
si pone termine alla procedura lasciando in AL
il valore binario appena calcolato |
 | altrimenti (la stringa contiene
2 caratteri) lo moltiplica (MUL
AH, vedi MUL) per 10 (MOV
AH,10) e gli somma il
secondo byte
sotto test, dopo averlo prelevato dalla posizione successiva
(INC SI) nella stringa e
convertito nel corrispondente valore binario (SUB
AL,'0') |
|
 | Di solito questa Procedura
viene attivata subito dopo aver acquisito la
stringa da tastiera, con una procedura attenta a filtrare ogni
carattere non autorizzato e, possibilmente, in grado di gestire al meglio
l'acquisizione con i giusti accorgimenti:
 | deve terminare automaticamente
dopo la pressione di 2 tasti validi |
 | deve ammettere la pressione del tasto
invio, per consentire la
conferma del dato ascii digitato |
 | deve ammettere la pressione del tasto
backspace, per consentire la modifica del dato ascii, durante la
digitazione |
 | deve segnalare con beep la pressione di tasti non
autorizzati |
|
 | La procedura non provvede alla
stampa del risultato; se si
desidera questo servizio basta chiamare la Procedura
Byt2Asc, progettata per
generare la stringa ascii
esadecimale corrispondente al valore del
byte passatole in AL e poi
porla a video con
il colore precedentemente predisposto in CS:[ATTRIB],
nella posizione di stampa corrente. |
 | Prima della
stampa del risultato è comunque opportuno
provvedere alla verifica di eventuali errori, controllando se il valore di AL
è FFH |
 | Il nostro progetto si occupa di
tutto, come puoi vedere nella prossima pagina. |
 | Una simile procedura è stata progettata per la
Libreria Pascal (Giobe.TPU),
con il nome di INexad. |
 | La Libreria
Giobe.ASM/LIB mette a
disposizione anche la Procedura
che provvede alla conversione opposta:
 | la
Byt2Dec converte il numero esadecimale a
8 bit (byte)
in una stringa Ascii decimale (fino
a 3 caratteri scelti tra i numeri da "0"
a "9"), posta a video nella posizione di
stampa corrente a livello BIOS |
|
 |
NB:
La procedura Dec2Byt
presente nella libreria
Giobe.ASM [Giobe.LIB]
contiene una lieve imprecisione, per altro praticamente irrilevante |
 | Desidero fare questa
precisazione, per amore della correttezza: mi sono accorto [febbraio
2007] di una incongruenza logica nella
Dec2Byt, a
livello Dec_B1; in questo punto del
codice la procedura effettua un controllo sul numero dei
caratteri ASCII decimali
effettivamente predisposti nella
stringa
da convertire; per operare questo controllo la
versione presente in libreria utilizza le istruzioni
CMP CX,2 e
JG Dec_B2),
nell'intento di verificare se il numero lasciato in CX è maggiore di 2. |
 | Il problema sta nel fatto che,
a rigor di logica, l'istruzione
JG dovrebbe esser sostituita da JA,
come mostrato nel listato corretto
presente in questa pagina. |
 | In fatti il numero da
controllare (presente in CX) è
decisamente un intero senza segno,
per cui la seconda [JA (Above, "superiore
a")] è logicamente più propria
rispetto alla prima [JG (Great,
"maggiore di", "più
grande di")], destinata al controllo di
numeri interi
con segno. |
 | Tuttavia, il fatto
che il processore sia chiamato ad interpretarlo (da
JG invece che da
JA) come numero
con segno
è praticamente irrilevante,
essendo il numero da controllare
comunque positivo e
praticamente molto piccolo,
quindi identico ad un numero
senza segno. |
 | Per questa ragione ho ritenuto di
non intervenire sul codice
presente nella libreria
Giobe.ASM [Giobe.LIB],
assolutamente funzionante anche senza questo dettaglio intellettuale, anche
per non creare differenze con le migliaia di copie già scaricate, sulle
quali è ovviamente impossibile intervenire... |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|