Repository 32bit  Forum
Repository 64bit  Wiki

[Assembly 8086] Acquisizione numeri [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[Assembly 8086] Acquisizione numeri [RISOLTO]

Messaggioda Blallo » lun giu 21, 2010 15:12

Salve a tutti
dovrei salvare 5 numeri (anche di più cifre) in una variabile di tipo word, leggendoli da tastiera
usando int 21h, dovrei dare nel registro AH il valore 0ah, giusto?
perchè al lancio continua come se niente fosse, non mi chiede nessun input
Ultima modifica di Blallo il gio giu 24, 2010 13:59, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3240
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [Assembly 8086] Acquisizione numeri

Messaggioda phobos3576 » lun giu 21, 2010 17:19

Non credere sia facile scrivere una subroutine per acquisire numeri dalla tastiera; infatti, devi tenere conto di tutte le eventualità possibili e immaginabili (inserimento di caratteri non validi, pressione del tasto Enter, pressione del tasto Backspace, svuotamento del buffer della tastiera, etc).

In alternativa alla INT 21h (servizi DOS), puoi anche usare la INT 16h (servizi del BIOS per la tastiera).

Chiamando la INT 16h con AL=01h, viene controllato il buffer della tastiera; se non è stato premuto alcun tasto, viene restituito ZF=1 (Zero Flag).
Si può scrivere quindi:
Codice: Seleziona tutto
readDigitLoop:
   mov      ah, 01h
   int      16h
   jz       readDigitLoop

Appena viene premuto un tasto, si ha ZF=0 e ciò provoca l'uscita dal loop.
Il tasto appena premuto può essere letto chiamando nuovamente la INT 16h con AL=00h:
Codice: Seleziona tutto
mov      ah, 00h
int      16h

I valori restituiti sono:

AL = ASCII keystroke pressed
AH = Scan code of key
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] Acquisizione numeri

Messaggioda Blallo » lun giu 21, 2010 17:22

ti ringrazio della risposta, ma non ho la minima idea di come si usi 16h
perchè nel nostro corso abbiamo analizzato solo la 21h
quindi direi che presupponiamo di inserire dati correttamente
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3240
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [Assembly 8086] Acquisizione numeri

Messaggioda phobos3576 » lun giu 21, 2010 23:27

Se vuoi usare la INT 21h non c'è problema; come ho scritto prima, la 21h è fornita dal DOS, mentre la 16h è fornita dal BIOS, ma i servizi che offrono per la tastiera sono del tutto simili.

Il servizio 0Ah della INT 21h che hai citato prima è denominato: "Input da tastiera su buffer".

Per avere questo servizio devi mettere 0Ah nel registro AH, mentre DS:DX deve contenere l'indirizzo (Seg:Offset) del buffer in cui scrivere i dati.

Il primo byte del buffer deve contenere il numero massimo di caratteri da leggere dalla tastiera ed è un numero compreso tra 1 e 255.

Questo servizio continua a leggere l'input dalla tastiera finché non viene premuto il tasto [Enter].
Dopo la pressione del tasto [Enter], nel secondo byte del buffer viene messo il numero di caratteri effettivamente letti; i caratteri letti iniziano quindi dopo i primi due byte del buffer e terminano con il codice del ritorno carrello 0Dh.
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] Acquisizione numeri

Messaggioda Blallo » mer giu 23, 2010 23:29

ok, grazie mille, credo di aver capito
sto facendo qualche prova
che dici, può andare?
a me non fa niente a video e il debugger non funziona tanto bene, quindi non saprei come mettere mano
Codice: Seleziona tutto
        .model small
        .stack
        .data
str1     db        10 dup (?)
str1_ind dd        str1
        .code
        .startup
        lds dx, str1_ind
        mov str1, 255
        mov ah, 0ah
        int 21h
        end
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3240
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [Assembly 8086] Acquisizione numeri

Messaggioda phobos3576 » gio giu 24, 2010 2:23

Adesso non ho a disposizione TASM (è su un vecchio PC 486) per cui ho scritto un programmino con NASM e funziona benissimo.

Nel tuo caso, sei sicuro che a str1_ind venga assegnato l'indirizzo Seg:Offset di str1?

Il codice di startup di TASM credo assegni automaticamente il blocco dati a DS; di conseguenza, ti basta scrivere:
Codice: Seleziona tutto
mov dx, offset str1

Inoltre, prova anche a scrivere:
Codice: Seleziona tutto
mov byte ptr str1[0], 255
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] Acquisizione numeri

Messaggioda Blallo » gio giu 24, 2010 13:59

in effetti così funziona
d'altrone sono stato cretino io, poichè
se sono con il model small
resto nel segmento
quindi mi basta l'offset
grazie mille!
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3240
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Yahoo [Bot] e 1 ospite