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 fatto per il secondo numero.
La somma vera e propria viene effettuata son 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 !


** [email protected] **