Esempio 12: somma di due numeri letti in input

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