Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Libreria GIOBE.ASM

Home » Programma il Computer » Tutorial Assembly

Raccolta di Procedure

  Raccolta di Procedure ASM

Dec2Wor [27 di 54] 

    

           Aggiornato 13 febbraio 2007
bulletConverte fino a 5 caratteri ASCII decimali nel numero binario a 32 bit che corrisponde loro.

 

bulletLa Procedura si chiama in questo modo:

               

  

bulletIn ingresso bisogna predisporre:
bulletSI con l'indirizzo di Offset della locazione che contiene il primo dei caratteri Ascii della stringa da convertire
bulletla 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
bulletla 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:

  

 

bulletIn uscita lascia:
bulletDX,AL con il numero esadecimale a 32 bit corrispondente ai caratteri Ascii della stringa da la procedura termina immediatamente
bullet se la stringa è vuota (cioè se contiene solo il terminatore 00H) la procedura termina immediatamente con DX=0000H,AX=0000H
bullet 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...
bulletse la sequenza di caratteri Ascii numerici esprime un numero inferiore o uguale a 65535, per il risultato basta AX.

               

bulletLa 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!!

               

  

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

  

bulletIn questi casi:
bulletla quantità di caratteri immessa nella stringa può essere inferiore a 5 per effetto della prematura pressione di Invio
bulletil terminatore risulta anticipato in posizione precedente rispetto a quella del sesto byte, prevista dalle specifiche
bulletdopo 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

  

bulletDunque, se la stringa da convertire non è nulla e ha meno di 6 caratteri ascii numerici:
bulletcalcola (in CX) l'effettivo numero di caratteri numerici presenti nella stringa da convertire, puntata da CS:SI
bulletse la stringa è composta esattamente da 5 caratteri non ha bisogno di manipolazioni: è il caso di default
bulletin 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:
bulletdi questo si occupano le istruzioni contenute tra DEC_W2 e LOOP DEC_W2
bulletdopo 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
bulletposto 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
bulletopera 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
bulletper dare peso alle singole cifre utilizza, di volta in volta, il moltiplicatore 1, 10=000AH, 100=0064H, 1000=03E8H e 10000=2710H
bulletnonostante la sua complessità il meccanismo delle moltiplicazioni successive è l'unico perseguibile per raggiungere il risultato
bulletin 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.

               

bulletDi 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:
bulletdeve terminare automaticamente dopo la pressione di 4 tasti validi
bulletdeve ammettere la pressione del tasto invio, per consentire la conferma del dato ascii digitato
bulletdeve ammettere la pressione del tasto backspace, per consentire la modifica del dato ascii, durante la digitazione
bulletdeve segnalare con beep la pressione di tasti non autorizzati

  

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

  

bulletPrima della stampa del risultato è comunque opportuno provvedere alla verifica di eventuali errori, controllando se il valore di DX è FFFFH

               

bulletUna simile procedura è stata progettata per la Libreria Pascal (Giobe.TPU), con il nome di INexad.
bulletLa Libreria Giobe.ASM/LIB mette a disposizione anche la Procedura che provvede alla conversione opposta:
bulletla 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.

  

Attenzione ! NB: La procedura Dec2Wor presente nella libreria Giobe.ASM [Giobe.LIB] contiene una lieve imprecisione, per altro praticamente irrilevante

  

bulletDesidero 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.
bulletIl 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.
bulletIn 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.

  

bulletTuttavia, 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.
bulletPer 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...

    

Pagina Precedente Libreria GiobeASM Pagina Successiva Dec2Wor   Torna alla Home  del Capitolo3 del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
27 di 54
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

    

Giobe.ASM » SET_cur | VIA_cur | RIP_cur | BIOScls| BIOSchr |BIObeep |Acapo| BIOchr1| STAsp| BIOSmsg
Byt2Asc | Wor2Asc | Asc2Byt | Asc2Wor | Byt2Dec | Wor2Dec | Dec2Byt | Dec2Wor
Delay | DelMicro | Del_2000 | Del1500 | Del_1000 | Del_100 | Del_1 | Del500Mi | Del200Mi
Del100Mi | Del010Mi | RIEMPI | KEYwait | Random | INstrin | CambiaCol | MODEtest
RAMchr | RAMcur | RAMmes | RAMcls | RAMcorn | RAMpiu | RAMrecup | RAMbyte | RAMword
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati