Vista la stampa, vediamo come si fa la fase di input da tastiera. Anche qui, c’è una combinazione fissa di valore/registro da impostare per “richiedere” alla CPU di procedere ad una operazione specifica di lettura.
; esempio 12
; leggi due numeri da tastiera, fai la somma, stampa risultato
.STACK
.DATA
addendo1 db ?
addendo2 db ?
.CODE
.STARTUP
;attende un input
MOV AH, 08h
INT 21h ;il carattere viene salvato in AL
SUB AL, 30h ; tolgo l’offset del carattere/numero
MOV addendo1, AL
MOV AX,0000h ;pulisco il registro da eventuali errori: in c++ la gestisci la memoria?
;attende un input
MOV AH, 08h
INT 21h ;il carattere viene salvato in AL
SUB AL, 30h ; tolgo l’offset del carattere/numero
MOV addendo2, AL
MOV AX, 0000h
MOV BL, addendo1
ADD BL, addendo2
;stampo il carattere
MOV AH,02h
MOV DX,BX ; copio il carattere in AL a DL per stamparlo
ADD DX,30h ; aggiungo l’offset ascii per stampare il carattere equivalente numero
INT 21h
.EXIT
END
Se volessimo semplificare la notazione con le funzioni predefinite di lettura e scrittura a schermo avremmo:
include ‘emu8086.inc’
.STACK
.DATA
.CODE
.STARTUP
;somma di due numeri inseriti da tastiera
PRINTN ‘inserisci il primo numero’
call SCAN_NUM ;scan_num restituisce la lettura dentro CX
mov ax, cx ;metto da parte dentro un registro, ad esempio cx
PRINTN ‘inserisci il secondo numero’
call SCAN_NUM
add ax, cx
PRINTN ‘il totale dei quattro numeri =’
call PRINT_NUM
;mi dichiaro delle funzioni
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
.EXIT
END
La versione SASM, sempre semplificata, con registri a 32bit
Ultima modifica 21 Febbraio 2022