PDA

Visualizza la versione completa : [Assembler | x8086] input di due numeri e somma


Mauri94
06-04-2012, 20:28
DOSSEG
.MODEL TINY
.CODE
ORG 0100h
Begin: JMP Main

IN_NUM1 DB 'Ins primo numero: ', '$'
IN_NUM2 DB 'Ins secondo numero: ', '$'
OUT_NUM DB 'Risultato: ', '$'
NUMERO DW ?
RISULTATO DW ?

Main: XOR AX, AX
XOR BX, BX
MOV AH, 09h
LEA DX, IN_NUM1
INT 21h
CALL INPUT_NUMERO
MOV BX, NUMERO
CALL ACCAPO
MOV AH, 09h
LEA DX, IN_NUM2
INT 21h
CALL INPUT_NUMERO
MOV AX, NUMERO
CALL ACCAPO
ADD AX, BX
MOV RISULTATO, AX
MOV AH, 09h
LEA DX, OUT_NUM
INT 21h
CALL OUTPUT_NUMERO
MOV AH, 4Ch
INT 21h
END Begin


Le subroutines funzionano tranquillamente, tutte provate singolarmente. Alla fine nella variabile NUMERO inserirò il numero preso in input nella subroutine e alla fine in RISULTATO visualizzerò il tutto. Questo perché? Perché arrivo a prendere in input e dare in output numeri < di 65.535 byte. Il problema è che una volta che visualizza 'ins primo numero', lo prende, 'ins secondo numero', lo prende.. termina il programma.. non mi mostra 'risultato: ', e non mi stampa il risultato. Mi aiutereste a capirne il motivo?

oregon
06-04-2012, 22:50
Molto probabilmente il problema è nell'interazione del main con le routine.

Faccele vedere ...

Mauri94
07-04-2012, 09:28
Le routine funzionano perfettamente, provate una per una. Eccole qua comunque:



INPUT_NUMERO PROC NEAR
MOV NUMERO, 0000h
Mentre: MOV AH, 01h
INT 21h
CMP AL, 30h
JB Fine
CMP AL, 39h
JA Fine
MOV AH, 00h
SUB AL, 30h
MOV CIFRA, AX
MOV AX, NUMERO
MOV BX, 0Ah
MUL BX
ADD AX, CIFRA
MOV NUMERO, AX
JMP Mentre
Fine: RET
INPUT_NUMERO ENDP



OUTPUT_NUMERO PROC NEAR
XOR CX, CX
Ciclopush: XOR DX, DX
MOV AX, RISULTATO
MOV BX, 0Ah
DIV BX
MOV RISULTATO, AX
ADD DL, 30h
INC CX
PUSH DX
CMP RISULTATO, 0000h
JNE Ciclopush
Ciclopop: POP DX
MOV AH, 02h
INT 21h
LOOP Ciclopop
RET
OUTPUT_NUMERO ENDP



ACCAPO PROC NEAR
MOV AH, 02h
MOV DL, 0Ah
INT 21h
MOV DL, 0Dh
INT 21h
RET
ACCAPO ENDP

oregon
07-04-2012, 10:33
Originariamente inviato da Mauri94
Le routine funzionano perfettamente

Infatti ti ho parlato di "interazione" tra il main e le routine.

Per capirci, se scrivi



MOV AX, NUMERO
CALL ACCAPO
ADD AX, BX


succede che carichi un valore in AX che la routine ACCAPO modifica con MOV AH, 02h falsando il risultato della ADD seguente.

Quindi, per prima cosa dovresti scrivere



CALL ACCAPO
MOV AX, NUMERO
ADD AX, BX


e controllare se è l'unico problema o ce ne sono altri simili.

Mauri94
07-04-2012, 10:35
Per andare a colpo sicuro potrei alla fine delle subroutines azzerare i registri che poi uso nel main?

Mauri94
07-04-2012, 10:39
Ho provato, ma nulla, stesso errore.

oregon
07-04-2012, 10:56
Originariamente inviato da Mauri94
Ho provato, ma nulla, stesso errore.

Un altro errore è nella gestione di BX



Main: XOR AX, AX
XOR BX, BX
MOV AH, 09h
LEA DX, IN_NUM1
INT 21h
CALL INPUT_NUMERO
MOV BX, NUMERO
PUSH BX
CALL ACCAPO
MOV AH, 09h
LEA DX, IN_NUM2
INT 21h
CALL INPUT_NUMERO
CALL ACCAPO
MOV AX, NUMERO
POP BX
ADD AX, BX
MOV RISULTATO, AX
MOV AH, 09h
LEA DX, OUT_NUM
INT 21h
CALL OUTPUT_NUMERO
MOV AH, 4Ch
INT 21h
END Begin


Non puoi caricare un valore in BX e usarlo dopo molto tempo sperando che BX non venga usato nelle altre routine che chiami.

Loading