Input e somma di due numeri compresi tra 0 e 9

; — input di due numeri, di una cifra cioe’ compresi tra 0 e 9
; — somma i due numeri
; — stampa del risultato

data segment

;la coppia di caratteri 0dh,0ah, corrispondenti, rispettivamente,
;ai caratteri di controllo CR (Carriage Return) e LF (Line Feed)
;serve per andare a capo prima di stampare la stringa.
;Il carattere $ presente nella stringa come carattere finale
;permette di individuare la fine della stringa nella
;visualizzazione della stessa.

str_inserire db 0dh,0ah,”Digitare una cifra: $”
str_risultato db 0dh,0ah,”La somma e’: $”
pkey db 0dh,0ah,”press any key…$”
ends

stack segment
db 128 dup(‘0’)
top db ?
ends

code segment
start:
; set segment registers:
mov ax, data ; indirizzo di data segment in ax
mov ds, ax ; copia ax in ds
mov es, ax ; copia ax in es

mov ax, stack ; indirizzo di stack segment in ax
mov ss, ax ; copia ax in ss

lea sp,top ; indirizzo (offset) di top in sp

lea dx,str_inserire ; indirizzo (offset) della stringa str_inserire (“Digitare una cifra:”) in dx

nonumber1:
mov ah, 09h
int 21h ; stampa a video della stringa il cui indirizzo e’ contenuto in dx(in questo caso str_inserire)

mov ah, 01h
int 21h ; attende che un carattere venga immesso da tastiera, quindi lo visualizza
; sullo schermo nella posizione corrente del cursore; in AL troviamo
; il codice ASCII del carattere immesso

; —- controllo che il carattere immesso sia compreso tra ‘0’ e ‘9’
; ja jump if above: salta, a nonumber1, se operando1 > operando2 (nel nostro caso se AL > ‘9’)
; jb jump if below: salta a nonumber1, se operando1 < operando2 (nel nostro caso se AL < ‘0’)

cmp al, ‘0’ ; confronto tra al e’0′; richiede di nuovo l’input se AL < ‘0’
jb nonumber1

cmp al, ‘9’ ; confronto tra al e “9”; richiede di nuovo l’input se AL > ‘9’
ja nonumber1

mov cl, al ; copia valore di al in cl

lea dx, str_inserire ;indirizzo di str_inserire(“Digitare una cifra:”) in dx

nonumber2: ;—– valgono i commenti fatti per nonumber1:
mov ah, 09h
int 21h

mov ah, 01h
int 21h

cmp al, ‘0’ ;confronto tra al e ‘0’; richiede di nuovo l’input se AL < ‘0’
jb nonumber2

cmp al, ‘9’ ;confronto tra al e “9”; richiede di nuovo l’input se AL > ‘9’
ja nonumber2

add cl, al ;cl=cl+al
sub cl, 30h ;cl=cl-30h: si sottrae 30; sommando (30+ I cifra) con (30+II cifra)
;si avrebbe (60 + risultato); sottraendo 30 si ottiene
;(30+risultato)

lea dx, str_risultato ;indirizzo di str_risultato (“La somma e’:”)
mov ah, 09h
int 21h

cmp cl, ‘9’
jle stampa ; jle jump if less or equal: salta a stampa, se operando1 < operando2
; (nel nostro caso se CL <= ‘9’)

mov dl, ‘1’ ; se risultato > 9 stampa ‘1’; sara’ seguito dalla cifra
mov ah, 02h ; meno significativa
int 21h

sub cl, 0Ah ; si sottra 10 per avere solo la cifra meno significativa del risultato
stampa:
mov dl, cl
mov ah, 02h ; stampa il carattere contenuto in DL (in DL e’ stato copiato il valore contenuto in CL)
int 21h

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key….
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.

Lascia un commento