[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.
Rispondi
Avatar utente
Blallo
Packager
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]

Messaggio 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
Ultima modifica di Blallo il gio 24 giu 2010, 14:59, modificato 1 volta in totale.

Avatar utente
phobos3576
Staff
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

Messaggio 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:

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
Blallo
Packager
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

Messaggio 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

Avatar utente
phobos3576
Staff
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

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

Avatar utente
Blallo
Packager
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

Messaggio 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

Avatar utente
phobos3576
Staff
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

Messaggio 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:

Codice: Seleziona tutto

mov dx, offset str1
Inoltre, prova anche a scrivere:

Codice: Seleziona tutto

mov byte ptr str1[0], 255

Avatar utente
Blallo
Packager
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

Messaggio 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!

Rispondi