Zoom Icon

Programma Somma

From UIC

Un Semplice Programma per Sommare

Contents


Programma Somma
Author: b0nu$
Email: bonus@numerica.it
Website:
Date: 01/01/2001 (dd/mm/yyyy)
Level: No brain needed
Language: Italian Flag Italian.gif
Comments:



Introduzione

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:


Essay

;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.


Note Finali

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 !


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.