Cerca nel sito:
ricerca
avanzata

Frasi Celebri...

Se un po' di sincerità è pericolosa, molta sincerità è addirittura fatale.

Oscar Wilde 

Sondaggio:

La Ferrari è...

Una leggenda
La storia
Schumacher
L'auto per eccellenza
Un sogno

visualizza risultati


 

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 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 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 !

 

successivo
–«  INDICE  »–

 

 

 

 
Powered by paper&pencil (carta&matita ) - Copyright © 2001-2009 Cataldo Sasso