|
Un semplice programma per sommare
Oggi vedremo nel dettaglio un prototipo di programma che esegue somme su numeri ad una sola cifra. Vi riporto subito il listato e poi
una spiegazione del flusso del programma:
;TUT8.ASM - by b0nu$ 1997
;Legge due numeri di una cifra e li somma.
;NOTA : 4+3 si scrive 04+03 !!!
SEG_A SEGMENT
ASSUME CS:SEG_A, DS:SEG_A
ORG 100H
Somma PROC FAR
INIT: JMP START ;salta a START
Msg_Num1 DB "Inserisci il primo addendo : $"
Msg_Num2 DB 13,10,"Inserisci il secondo addendo : $"
Num1 DW 0
Num2 DW 0
Totale DW 0
START:
; -- Lettura del primo addendo
mov dx,OFFSET Msg_Num1 ;stampo il primo msg
mov ah,09h
int 21h
mov ah,01h
mov si,0
Leggi_1: int 21h ;leggo un carattere
cmp al,0Dh ;Enter ?
je Fine_1
sub al,30h
mov BYTE PTR Num1[si],al ;lo metto in Num1
inc si
jmp Leggi_1
Fine_1:
; -- Lettura del secondo addendo
mov dx,OFFSET Msg_Num2 ;stampo il secondo msg
mov ah,09h
int 21h
mov ah,01h
mov si,0
Leggi_2: int 21h ;leggo un carattere
cmp al,0Dh ;Enter ?
je Fine_2
sub al,30h
mov BYTE PTR Num2[si],al ;lo metto in Num2
inc si
jmp Leggi_2
Fine_2:
; -- salta una riga
mov ah,02h
mov dl,13
int 21h
mov dl,10
int 21h
; -- Somma dei due numeri
mov ax,Num2 ;cifra del Num2
add ax,Num1 ;cifra del Num1
aaa ;metto a posto
le cifre
mov totale,ax
add BYTE PTR totale[0],30h ;prepara per la stampa
add BYTE PTR totale[1],30h
mov al,'$' ;aggiunge il terminatore
mov BYTE PTR totale[2],al
mov ah,09h
mov dx,OFFSET totale
int 21h ;stampa risultato
RETN
Somma ENDP
SEG_A ENDS
END INIT
Come potete vedere il programma è abbastanza didattico nel senso che non è per niente ottimizzato ma serve come base
per capire come si possono eseguire le operazioni matematiche in Assembly.
Si inizia con la dichiarazione delle varibili che ci serviranno nel programma: due stringhe da visulizzare e tre varibili per contenere
i due numeri e il risultato.
Le variabili Num1 e Num2 occupano due byte 1 per ogni cifra in notazione BCD, lo stesso vale per il totale quindi la somma non può
superare 99.
Il programma comincia visualizzando la prima stringa e leggendo il primo numero tramite l'interrupt 21h/01h. Viene letto una cifra
per volta quindi è importante inserire prima le decine (inserendo 0 se il numero è ad una cifra) e poi le unità.
Lo stesso lavoro viene fatto per il secondo numero. La somma vera e propria viene effettuata con l'operazione ADD seguita
da AAA per sistemare il risultato in notazione BCD per facilitare la visualizzazione a video.
Notate che alle cifre del risultato ho sommato 30h che è il codice ASCII dello zero, questo mi serve per convertire il risultato
in un carattere da visualizzare e in questo caso lo converto nel carattere della cifra corrispondente. Viene poi aggiunto un terminatore
al risultato ($) e viene effettuata la stampa.
Non mi sono dilungato molto sulla spiegazione del programma vorrei che ognuno di voi se lo studi per proprio conto e magari cerchi
di modificarlo facendo in modo che si possa superare la soglia dei 99 (basta controllare il CF dopo la somma ed eventualmente mettere
un 1 davanti al risultato). Beh in pratica vi ho già detto come si fa .... allora provate a farne uno che esegue una sottrazione
o una moltiplicazione... ciao !
|