Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115

    [Assembler | x8086] input di due numeri e somma

    codice:
              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?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Molto probabilmente il problema è nell'interazione del main con le routine.

    Faccele vedere ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Le routine funzionano perfettamente, provate una per una. Eccole qua comunque:

    codice:
    	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
    codice:
    	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
    codice:
    ACCAPO                        PROC NEAR
    	                           MOV AH, 02h
    				   MOV DL, 0Ah
    				   INT 21h
    				   MOV DL, 0Dh
    				   INT 21h
    				   RET
    ACCAPO                        ENDP

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da Mauri94
    Le routine funzionano perfettamente
    Infatti ti ho parlato di "interazione" tra il main e le routine.

    Per capirci, se scrivi

    codice:
    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

    codice:
    CALL ACCAPO
    MOV AX, NUMERO
    ADD AX, BX
    e controllare se è l'unico problema o ce ne sono altri simili.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Per andare a colpo sicuro potrei alla fine delle subroutines azzerare i registri che poi uso nel main?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Ho provato, ma nulla, stesso errore.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da Mauri94
    Ho provato, ma nulla, stesso errore.
    Un altro errore è nella gestione di BX

    codice:
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.