[Assembly 8086] Acquisizione numeri [RISOLTO]
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.
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.
- Blallo
- Packager
- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
[Assembly 8086] Acquisizione numeri [RISOLTO]
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
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 24 giu 2010, 14:59, modificato 1 volta in totale.
Github: https://github.com/8lall0
- phobos3576
- Staff
- Messaggi: 2980
- Iscritto il: dom 17 apr 2005, 0:00
- Slackware: 13.1
- Kernel: 2.6.37-smp
- Desktop: KDE 4.5.3
Re: [Assembly 8086] Acquisizione numeri
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
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
Il tasto appena premuto può essere letto chiamando nuovamente la INT 16h con AL=00h:
Codice: Seleziona tutto
mov ah, 00h
int 16h
AL = ASCII keystroke pressed
AH = Scan code of key
- Blallo
- Packager
- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: [Assembly 8086] Acquisizione numeri
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
perchè nel nostro corso abbiamo analizzato solo la 21h
quindi direi che presupponiamo di inserire dati correttamente
Github: https://github.com/8lall0
- phobos3576
- Staff
- Messaggi: 2980
- Iscritto il: dom 17 apr 2005, 0:00
- Slackware: 13.1
- Kernel: 2.6.37-smp
- Desktop: KDE 4.5.3
Re: [Assembly 8086] Acquisizione numeri
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.
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.
- Blallo
- Packager
- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: [Assembly 8086] Acquisizione numeri
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
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
Github: https://github.com/8lall0
- phobos3576
- Staff
- Messaggi: 2980
- Iscritto il: dom 17 apr 2005, 0:00
- Slackware: 13.1
- Kernel: 2.6.37-smp
- Desktop: KDE 4.5.3
Re: [Assembly 8086] Acquisizione numeri
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:
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
Codice: Seleziona tutto
mov byte ptr str1[0], 255
- Blallo
- Packager
- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: [Assembly 8086] Acquisizione numeri
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!
d'altrone sono stato cretino io, poichè
se sono con il model small
resto nel segmento
quindi mi basta l'offset
grazie mille!
Github: https://github.com/8lall0