|
 |
Raccolta di Procedure ASM |
Dec2Wor
[27 di 54] |
|
|
 |
Aggiornato 13
febbraio 2007 |
 | Converte
fino a 5 caratteri ASCII decimali nel
numero binario a 32 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 5 caratteri solo Ascii numerici
(non necessariamente inizializzati a '0')
e
terminata con il byte 00H: |
|
 | In uscita lascia:
 | DX,AL
con il numero esadecimale a 32 bit
corrispondente ai caratteri Ascii della stringa
da
la procedura termina immediatamente |
 |
se la stringa è vuota (cioè se
contiene solo il terminatore
00H)
la procedura termina immediatamente con
DX=0000H,AX=0000H |
 |
se la stringa contiene più di 5 caratteri
la procedura termina subito e lascia in uscita
DX=FFFFH,AX=0000H,
utile per esercitare un eventuale controllo
d'errore dopo la sua chiamata... |
 | se la sequenza di caratteri Ascii numerici esprime un
numero inferiore o
uguale a 65535, per il risultato basta
AX. |
|
 | La seguente Area di Testo
mostra il Modulo varie14 utilizzato per
inserire la Procedura
nella Libreria
Giobe.ASM/LIB: |
|
Dec2Wor / varie14 |
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!! |
 | Va sottolineato che, nonostante sia
assolutamente necessario disporre a un'area di memoria (variabile)
composta da 6 bytes (i
5 caratteri e il terminatore 00H),
essa può risultare riempita anche
parzialmente; è il caso dei programmi che
immettono in essa i codici
dei tasti numerici premuti. |
 | In questi casi:
 | la quantità di caratteri
immessa nella stringa può essere inferiore a 5
per effetto della prematura pressione di Invio |
 | il terminatore risulta
anticipato in posizione precedente rispetto a quella del sesto
byte, prevista dalle specifiche |
 | dopo un'acquisizione da tastiera, la stringa potrebbe per esempio
contenere '183',00H,'0',00H,
con la parte iniziale immessa da tastiera
e la parte finale frutto della
predisposizione di default |
|
 | Dunque, se la stringa da convertire non è
nulla e ha meno di 6 caratteri ascii
numerici:
 | calcola (in CX) l'effettivo
numero di caratteri numerici presenti nella
stringa da convertire, puntata da CS:SI |
 | se la stringa è composta esattamente da
5 caratteri non ha bisogno di manipolazioni: è il caso di default |
 | in tutti gli altri casi (di solito frutto di una
acquisizione da tastiera terminata con
pressione prematura di Invio) per facilitare la successiva operazione di conversione,
è necessario ottimizzare la stringa:
 | di questo si occupano le istruzioni contenute tra
DEC_W2
e LOOP DEC_W2 |
 | dopo aver spostato tutti i caratteri effettivamente
presenti di un posto a destra, si
aggiungono da sinistra tanti caratteri '0'
quanti sono necessari per far assumere
alla stringa comunque una dimensione di 5 caratteri |
 | posto T=terminatore=00H,
l'aspetto del contenuto di DEPO
può essere così illustrato: prima dell'acquisizione '00000T',
dopo l'acquisizione 183T0T,
dopo l'aggiustamento 00183T |
|
 | opera la conversione
della stringa ottimizzata sommando al
totale progressivo (DI,BP)
il contributo di peso 1 delle
unità e i pesi 10, 100, 1000, 10000
delle eventuali decine,
centinaia,
migliaia, decine di migliaia |
 | per dare peso alle singole
cifre utilizza, di volta in volta, il moltiplicatore 1, 10=000AH, 100=0064H, 1000=03E8H
e 10000=2710H |
 | nonostante la sua complessità il meccanismo delle
moltiplicazioni successive è l'unico
perseguibile per raggiungere il risultato |
 | in uscita il risultato a
32 bit della conversione di numeri da 0 a 99999 è affidato alla
coppia DX,AX
e la variabile Depo
conterrà la stringa
di partenza, giustificata a destra e con davanti degli
eventuali '0'
non significativi. |
|
 | 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 4 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
Wor2Asc, progettata per
generare la stringa ascii
esadecimale corrispondente al valore del
byte passatole in AX 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
DX
è FFFFH |
 | 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
Wor2Dec converte il numero esadecimale a 16 bit (word)
in una stringa Ascii decimale (fino
a 5 caratteri scelti tra i numeri da "0"
a "9"), posta a video nella posizione di
stampa corrente a livello BIOS. |
|
 |
NB:
La procedura Dec2Wor
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
Dec2Wor, a
livello Dec_W1; 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,5
e
JG Dec_W8),
nell'intento di verificare se il numero lasciato in CX è maggiore di 5. |
 | 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
|