Linux2004
03-04-2006, 12:02
Ho scritto questo programma che effettua la somma tra due numeri che inserisce l'utente... il problema è sommare i due valori e stampare a video il risulato. Ho provato la soluzione che potete vedere nel programma senza successo :(
;questo programma riceve in ingresso due numeri ed effettua la somma per poi stampare il risultato a video
INCLUDE utility.asm
mystack SEGMENT STACK
DW 40 DUP(?)
mystack ENDS
mydata SEGMENT
messaggio BYTE 10,13,'Inserisci il primo numero[0-9]: ','$'
messaggio2 BYTE 10,13,'Inserisci il secondo numero[0-9]: ','$'
messaggio3 BYTE 10,13,'Il carattere inserito non Š valido... il programma verr… terminato...','$'
messaggio4 BYTE 10,13,'La somma dei valori inseriti Š: ','$'
a1 DWORD 0
a2 DWORD 0
mydata ENDS
mycode SEGMENT
start: MOV AX,SEG mydata
MOV DS,AX
MOV DX,OFFSET messaggio
CALL video
;uso il registro CX come contatore delle lettere digitate dall'utente
MOV CX,2
;capta dalla tastiera i numeri che inserisce l'utente
capta: CALL tastiera ;prelevo un valore inserito dall'utente
;controllo se l'utente ha premuto il tasto enter
CMP AL,0DH
JE errore
;converte il carattere in un numero
ADD AL,-30H
JL errore
;controlla se il carattere è un numero minore di 0
CMP AL,0
JL errore
;controlla se il carattere è un numero maggiore di 9
CMP AL,9
JG errore
;decrementa il contatore contenuto nel registro CX e salta indietro all'etichetta capta
DEC CX
CMP CX,0
JG mess2
JE somma
;visualizza il messaggio di errore
errore: MOV DX,OFFSET messaggio3
CALL video
CALL dos
;visualizza il messaggio che informa l'utente dell'inserimento del secondo valore
mess2: MOV SI,OFFSET a1
MOV DS:[SI],AL
MOV DX,OFFSET messaggio2
CALL video
JMP capta
;effettua la somma dei i numeri inseriti dall'utente
;memorizza in a2 il secondo valore inserito dall'utente
somma: MOV DI,OFFSET a2
MOV DS:[DI],AL
;visualizza il messaggio con il risultato
MOV DX,OFFSET messaggio4
CALL video
MOV AX,DS:[SI]
ADD AX,DS:[DI]
MOV DX,AX
CALL video
JMP dos
mycode ENDS
END start
Allego anche il file utility.asm
;questo programma è stato scritto per mettere a disposizione due procedure che permettono al programmatore di stampare a video un messaggio contenuto nel registro selettore AL
mycode SEGMENT
tastiera PROC FAR
MOV AH,01H
INT 21H
RET
tastiera ENDP
video PROC FAR
MOV AH,09H
INT 21H
RET
video ENDP
dos LABEL FAR
MOV AH,4CH
INT 21H
mycode ENDS
Grazie per l'aiuto
;questo programma riceve in ingresso due numeri ed effettua la somma per poi stampare il risultato a video
INCLUDE utility.asm
mystack SEGMENT STACK
DW 40 DUP(?)
mystack ENDS
mydata SEGMENT
messaggio BYTE 10,13,'Inserisci il primo numero[0-9]: ','$'
messaggio2 BYTE 10,13,'Inserisci il secondo numero[0-9]: ','$'
messaggio3 BYTE 10,13,'Il carattere inserito non Š valido... il programma verr… terminato...','$'
messaggio4 BYTE 10,13,'La somma dei valori inseriti Š: ','$'
a1 DWORD 0
a2 DWORD 0
mydata ENDS
mycode SEGMENT
start: MOV AX,SEG mydata
MOV DS,AX
MOV DX,OFFSET messaggio
CALL video
;uso il registro CX come contatore delle lettere digitate dall'utente
MOV CX,2
;capta dalla tastiera i numeri che inserisce l'utente
capta: CALL tastiera ;prelevo un valore inserito dall'utente
;controllo se l'utente ha premuto il tasto enter
CMP AL,0DH
JE errore
;converte il carattere in un numero
ADD AL,-30H
JL errore
;controlla se il carattere è un numero minore di 0
CMP AL,0
JL errore
;controlla se il carattere è un numero maggiore di 9
CMP AL,9
JG errore
;decrementa il contatore contenuto nel registro CX e salta indietro all'etichetta capta
DEC CX
CMP CX,0
JG mess2
JE somma
;visualizza il messaggio di errore
errore: MOV DX,OFFSET messaggio3
CALL video
CALL dos
;visualizza il messaggio che informa l'utente dell'inserimento del secondo valore
mess2: MOV SI,OFFSET a1
MOV DS:[SI],AL
MOV DX,OFFSET messaggio2
CALL video
JMP capta
;effettua la somma dei i numeri inseriti dall'utente
;memorizza in a2 il secondo valore inserito dall'utente
somma: MOV DI,OFFSET a2
MOV DS:[DI],AL
;visualizza il messaggio con il risultato
MOV DX,OFFSET messaggio4
CALL video
MOV AX,DS:[SI]
ADD AX,DS:[DI]
MOV DX,AX
CALL video
JMP dos
mycode ENDS
END start
Allego anche il file utility.asm
;questo programma è stato scritto per mettere a disposizione due procedure che permettono al programmatore di stampare a video un messaggio contenuto nel registro selettore AL
mycode SEGMENT
tastiera PROC FAR
MOV AH,01H
INT 21H
RET
tastiera ENDP
video PROC FAR
MOV AH,09H
INT 21H
RET
video ENDP
dos LABEL FAR
MOV AH,4CH
INT 21H
mycode ENDS
Grazie per l'aiuto