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 !