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

Palestra Livello Apprendisti Livello Esperti

Home » Programma il Computer » Tutorial Assembly

Palestra Assembly - Home Page

  Programmare in Assembly

Esercizio n° A012 3/4 [65 di 157] 

               

Analisi del Codice · Analisi del Main Loop · Conclusioni

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]
bulletData per spiegata la fase iniziale (Desktop) e finale (rientro al DOS) vediamo cosa succede nel Main Loop di EsA012.ASM:

  

Console - Video & Tastiera

Esercizio FACILE Esercizio
NB: se il testo nell'Area  ti sembra strano
     
installa il  font
Giobe.TTF: clicca qui!!
Mostra l'Effetto Prova l'eseguibile COM Scarica il codice Sorgente ASM

  

bulletL'esecuzione del programma viene fermata, a livello xxx00, in attesa della pressione di un tasto qualunque.

  

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

  

bulletL'analisi di questi 2 bytes ci consente di scoprire se il tasto premuto è tra quelli che autorizzati:
bulletil primo tasto da rilevare è sempre ESC: se risulta premuto (CMP AL,ESC, JZ xxx02) si impone un salto a livello xxx02, dove è facile verificare si impone il ritorno al sistema operativo, dopo un messaggio di commiato
bulletla specificità di EsA012.ASM è quella di controllare il codice ascii ricevuto in AL per vedere se è compreso tra '0' (codice 30H) e '9' (codice 39H)
bulletè interessante notare l'algoritmo assembly utilizzato per la verifica: se è più grande dell'ultimo numero, '9'=39H (CMP AL,'9', JA xxx01, Above, "superiore a") o più piccolo del primo numero, '0'=30H (CMP AL,'0', JB xxx01, Below, "inferiore a") non ci interessa

  

001FH   3039H   80FFH
Ascii di Controllo ..... '0'÷'9' ..... Ascii Estesi

<─ JB xxx01 NO ───┤

 

├──── NO JA xxx01 ──>

0÷31   48÷57   128÷255

  

bulletse il codice Ascii è compreso nell'intervallo significa che appartiene ad un tasto autorizzato (numerico) e per ciò si provvede al servizio richiesto: il carattere corrispondente è posto a video nella posizione di stampa corrente (CALL BIOchr1) imponendo subito dopo il rientro (JMP SHORT xxx00) in attesa della pressione di un altro tasto
bulletse non è così si salta a livello xxx01, dove viene prodotta una segnalazione acustica (CALL BIObeep) e un immediato rientro in attesa tasti, a livello xxx00 (JMP SHORT xxx00)

  

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

  

bulletQuesto avviso può essere sufficiente, anche se, con una piccola difficoltà in più, è possibile fornire un messaggio, probabilmente più efficace.

  

bulletAnche 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

               

Attenzione ! 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.

  

bulletSebbene 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.
bulletQuesti quattro modi di esprimere espressioni comparative sono utilizzati dal processore per definire altrettante istruzioni, dedicate (con altre) alla definizione degli intervalli tra numeri, precisamente:
bulletper numeri con segno: JG (Great, "maggiore di", "più grande di") e JL (Least ("minore di", "più piccolo di")
bulletper numeri senza segno: JA (Above, "superiore a") e JB (Below, "inferiore a")

  

bulletLe 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

               

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

               

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

    

Pagina Precedente Palestra Apprendisti Pagina Successiva Esercizio n° A012 3/4   Torna alla Home  della Palestra Assembly Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
65 di 157
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

    

PALESTRA » Apprendisti » Es.001 Es.002 Es.003 Es.004 Es.005 Es.006 Es.007 Es.008 Es.009 Es.010 Es.011 Es.012
Es.013 Es.014 Es.015 Es.016 Es.017 Es.018 Es.019 Es.020 Es.021 Es.022 Es.023 Es.024
Es.025 Es.026 Es.027 Es.028 Es.029 Es.030 Es.031 Es.032 Es.033

| Che serve per iniziare | Prima compilazione | Livello Esperti |

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