PROGRAMMAZIONE IN ASSEMBLY

Un semplice programma per sommare


Questi file sono protetti dal diritto d'autore e sono liberamente
riproducibili a condizione di non farne uso comemrciale o economico o per
fine di lucro senza la preventiva autorizzazione dell'autore. In ogni caso
deve sempre essere indicato il nome dell'autore e il suo indirizzo. Ogni
altra modalita' di utilizzo deve considerarsi contraria alla volonta'
dell'Autore.


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 letta una cifra per volta quindi è importante
inserire prima le decine(eventualmente 0) 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 per effettuare
somme più complesse.


Per richieste, consigli, suggerimenti, aiuti, contributi, ecc..., contattatemi

b0nu$,e-mail : bonus@numerica.it


hAck & c ya :-)

TORNA INDIETRO