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: |
|
| Language: | Italian |
| 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
;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.