Sezione |
Indirizzi Base
Registri Interni
|
Palestra Livello Apprendisti Livello Esperti |
Programmare in Assembly |
Esercizio n° A012 3/4 [65 di 157] |
|
|
||
Acquisizione Caratteri - Aspetta la pressione di soli tasti NUMERICI e ne fa eco - errore con Beep | ||
Analisi del Main Loop |
|
Aggiornato 12 febbraio 2007 - [nel sorgente Es012.ASM sostituito JG xxx01 con JA xxx01; ricompilare l'esercizio] |
Data per spiegata la fase iniziale (Desktop) e finale (rientro al DOS) vediamo cosa succede nel Main Loop di EsA012.ASM: |
|
|
Esercizio |
NB: se il testo nell'Area
ti
sembra strano installa il font Giobe.TTF: clicca qui!! |
|
L'esecuzione del programma viene fermata, a livello xxx00, in attesa della pressione di un tasto qualunque. |
|
In accordo con le informazioni fornite nella preziosa scheda associata alla procedura KEYwait, non appena ciò accade sono subito disponibili il codice Ascii (in AL) e il codice di scansione (in AH) associati al tasto premuto. |
|
L'analisi di questi 2 bytes ci consente di scoprire
se il tasto premuto è tra quelli che autorizzati:
|
|
Dunque il nostro programma esegue la stampa dei soli caratteri ascii numerici, cioè autorizza la pressione solo di tasti numerici; in tutti gli altri casi (con la sola eccezione del tasto ESC) emette una segnalazione acustica. |
|
Questo avviso può essere sufficiente, anche se, con una piccola difficoltà in più, è possibile fornire un messaggio, probabilmente più efficace. |
|
Anche per questo esercizio ti ho preparato l'estratto del file Listato EsA012.LST, generato dall’assemblatore; con esso puoi tentare una eventuale analisi in ambiente Debug: |
|
Scarica il file EsA012.LST |
|
NB: L'analisi del campo d'appartenenza (intervallo) dei codici ascii associati ai tasti premuti mette in evidenza un importante problema legato alla gestione dei numeri interi: il processore tratta in modo diverso i numeri con segno e numeri senza segno, affidando la loro gestione a istruzioni diverse. |
|
Sebbene sembri umanamente istintivo scambiare tra loro affermazioni come ["maggiore di", "più grande di"] con ["superiore a"] oppure ["minore di", "più piccolo di"] con ["inferiore a"], il processore, nella sua fredda logica, la pensa diversamente. | |||||
Questi quattro modi di esprimere
espressioni comparative sono utilizzati
dal processore per definire altrettante
istruzioni, dedicate (con altre) alla
definizione degli intervalli tra numeri,
precisamente:
|
|
Le tabelle seguenti, estratte dalla scheda dedicata alla descrizione di tutte le istruzioni di questo tipo, mostrano tutte le possibilità per entrambi i casi: |
|
PseudoOp | Numeri senza segno |
JA JAE JB JBE JNA JNAE JNB JNBE |
Salta se è Maggiore Salta se è Maggiore o Uguale Salta se è Minore Salta se è Minore o Uguale Salta se non è Maggiore Salta se non è Maggiore o Uguale Salta se non è Minore Salta se non è Minore o Uguale |
|
PseudoOp | Numeri con segno |
JG JGE JL JLE JNG JNGE JNL JNLE |
Salta se è Maggiore Salta se è Maggiore o Uguale Salta se è Minore Salta se è Minore o Uguale Salta se non è Maggiore Salta se non è Maggiore o Uguale Salta se non è Minore Salta se non è Minore o Uguale |
|
Sia il codice Ascii che il codice di scansione, lasciati rispettivamente in AL e in AH dalla procedura KEYwait, sono numeri senza segno, potenzialmente compresi tra 00H e FFH. |
|
Possiamo concludere che, per stabilire l'appartenenza ai vari intervalli possibili, sarà necessario utilizzare le istruzioni della prima tabella; l'utlizzo di quelli della seconda può portare a risultati imprevedibili e comunque non garantirà un filtraggio adeguato dei codici coinvolti. |
|
Palestra Apprendisti | Esercizio n° A012 3/4 | |||||||
65 di 157 |
|
|
|
Home |
|
|||||||
|
Motore Ricerca |
|