Pagina 1 di 1
[Assembly 8086] Acquisizione numeri [RISOLTO]
Inviato: lun 21 giu 2010, 16:12
da Blallo
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
Re: [Assembly 8086] Acquisizione numeri
Inviato: lun 21 giu 2010, 18:19
da phobos3576
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:
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:
I valori restituiti sono:
AL = ASCII keystroke pressed
AH = Scan code of key
Re: [Assembly 8086] Acquisizione numeri
Inviato: lun 21 giu 2010, 18:22
da Blallo
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
Re: [Assembly 8086] Acquisizione numeri
Inviato: mar 22 giu 2010, 0:27
da phobos3576
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.
Re: [Assembly 8086] Acquisizione numeri
Inviato: gio 24 giu 2010, 0:29
da Blallo
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
Re: [Assembly 8086] Acquisizione numeri
Inviato: gio 24 giu 2010, 3:23
da phobos3576
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:
Inoltre, prova anche a scrivere:
Re: [Assembly 8086] Acquisizione numeri
Inviato: gio 24 giu 2010, 14:59
da Blallo
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!