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° A004 2/6 [27 di 157] 

               

Analisi del Codice · Analisi in ambiente Debug · Conclusioni

Gestione Caratteri - Stampa una stringa in bianco e nero
Analisi del Codice

               

bulletTralasciamo il commento sulla struttura base e sulla dichiarazione degli EXTRN per le 3 procedure, ormai ben note (BIOScls, BIOSchr e KEYwait).
bulletFissiamo l'attenzione sull'area dati e sul Main Program di EsA004.ASM, evidenziate dalla solita casella di testo:

  

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

  

bulletPer provvedere alla stampa di un testo è importante strutturarlo:
bullettutte le stringhe ascii si definiscono nell'area dati scrivendole tra virgolette, dopo l'etichetta e la parola chiave DB
bulletè necessario aggiungere sempre (dopo il testo tra virgolette) una virgola e la parola 00H, cioè ,00H
bulletil byte 00H è detto terminatore di stringa e la sua presenza è legata ad una mia scelta personale; in questo modo, infatti, la struttura che provvederà alla stampa a video potrà sapere con certezza qual'è l'ultimo carattere da stampare, indipendentemente dalla lunghezza della stringa.
bulletnel nostro esempio l'unica stringa del programma rispetta queste direttive:

  

  

bulletIl progetto della struttura chiamata a stampare la stringa inizia subito dopo la consueta pulizia (ClearScreen) dello schermo (CALL BIOScls)
bulletLa prima  cosa da fare è puntarla, cioè destinare un registro per localizzarla; nel nostro codice il puntatore è SI e la stringa da stampare è Testo01: per localizzarla si usa l'istruzione LEA (LEA SI,Testo01).

  

bulletSegue un ciclo continuo (xxx00: >>> JMP SHORT xxx00), nel quale si sviluppano tutte le fasi della procedura:
bulletsi preleva il carattere corrente (cioè quello attualmente puntato da SI, MOV AL,CS:[SI]) e si verifica se si tratta del terminatore (il byte 00H, CMP AL,00H)
bulletse è così (JZ) la stampa ha termine: viene imposta l'uscita dal ciclo (JZ xxx01)
bulletaltrimenti la procedura BIOSchr provvede (CALL BIOSchr) a collocare il carattere corrente nella posizione di stampa corrente e a spostare il cursore di una posizione a destra; segue il rientro nel ciclo (JMP SHORT xxx00) per il servizio del carattere successivo

  

bulletLa prima istruzione fuori ciclo è la consueta attesa della pressione di un tasto qualunque (CALL KeyWait): nell'attesa è possibile leggere con comodo il messaggio appena stampato... e quando ne avremo abbastanza le ultime 2 indispensabili istruzioni provvederanno alla corretta chiusura del programma.

  

bulletPrima di chiudere desidero segnalarti un paio di particolarità:

      

Suggerimento l'istruzione MOV AL,CS:[SI] si legge: sposta in AL (registro a 8 bit) il byte contenuto nella locazione puntata da CS:[SI]; personalmente amo puntare le locazioni con il segment override CS:, anche se questo costa un byte di codice macchina in più; la cosa però non è strettamente necessaria e l'istruzione MOV AL,[SI] sarebbe andata bene lo stesso, data la natura intrasegmentale di un programma di tipo COM; faccio notare che però in questo caso l'istruzione sarebbe stata compilata con riferimento al registro di segmento DS.

      

Suggerimento nelle operazioni di rientro e, in generale, nell'esecuzione dei salti non condizionati a me piace usare l'operatore SHORT (JMP SHORT xxx00); in questo caso si guadagna un byte di codice macchina, sempre che l'istruzione possa essere compilata; se la distanza tra il punto di partenza e quello d'arrivo è eccessiva viene infatti segnalato error A2053: Jump out of range by nnn byte(s), per cui, come ben spiegato nella pagina dedicata a JMP, l'operazione non è possibile e basta non mettere l'operatore...

    

Pagina Precedente Palestra Apprendisti Pagina Successiva Esercizio n° A004 2/6   Torna alla Home  della Palestra Assembly Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
27 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