| V I S U A L I Z Z A D I S C U S S I O N E |
| axelgenus |
Inserito il - 27/05/2005 : 18:34:34 Ciao a tutti,
ricollegandomi al thread precedente "Conversione HEX->DEC" ho trovato una soluzione: utilizzare il metodo delle divisioni successive. D'altronde è lo stesso metodo adottato dal prof. Anelli.
Ho tentato di riscrivere il programma in modo che converta un'intera parola (16 bit) da esadecimale e decimale, invece che un solo byte per volta. Purtroppo l'istruzione DIV mi da sempre errore di "overflow di divisione". Quacuno mi può spiegare in che cosa consiste e come si può risolvere?
Grazie, Axel.
PS - Scusate l'insistenza con cui posto su questo forum ma lunedì ho l'esame di laboratorio e vorrei andarci ben preparato!  |
| 7 U L T I M E R I S P O S T E (in alto le più recenti) |
| silent |
Inserito il - 16/06/2005 : 18:31:13 qualcuno mi sa dire perchè questo esercizio mi da l'errore di overflow di divisione (nella proc PARIV)
;programma che acquisisce 5 numeri da tastiera,ne esegue la somma ;e mi dice i numeri pari ;============================SEGMENTO STACK============================== STACK SEGMENT PARA STACK 'STACK' DB 100H DUP(0) STACK ENDS ;============================SEGMENTO DATI============================== DATA SEGMENT PARA PUBLIC 'DATA' TOTALE DB 5 ;quanti numeri contiene il vettore VETTORE DB 5 DUP(0) SOMMA DW 0 ;risultato della somma PARI DW 0 DIECI DB 10 ;conversione ASCII-numero DIECIW DW 10 ;conversione nuero-ASCII ACCAPO DB 13,10,'$' MSGX DB 'IMMETTERE UN VALORE : $' MSG1 DB 'LA SOMMA RISULTA= $' MSG2 DB ': $' MSG3 DB 'I NUMERI PARI SONO: $' MSG4 DB ': $' DATA ENDS ;============================SEGMENTO CODICE============================ CODE SEGMENT PARA PUBLIC 'CODE' MAIN PROC FAR ;================prologo standard========================= ASSUME CS:CODE PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV ES,AX ASSUME ES:DATA MOV DS,AX ASSUME DS:DATA ;=======================MAIN===================== CALL ACQUISIZIONE CALL CALCOLO CALL OUTPUT CALL PARIV RET ;=========================PROCEDURE======================= ;------------------------------------------------------------------------- INPUT PROC NEAR XOR DX,DX LEA DX,MSGX CALL VISUAL CALL INPUT_N ;acquisisce un valore e pone il risultato in AL RET INPUT ENDP ;------------------------------------------------------------------- ACQUISIZIONE PROC NEAR XOR AX,AX XOR BX,BX XOR CX,CX MOV CL,5 CICLO: CALL INPUT MOV VETTORE[BX],AL INC BX LOOP CICLO RET ACQUISIZIONE ENDP ;------------------------------------------------------------------- CALCOLO PROC NEAR XOR AX,AX XOR BX,BX XOR CX,CX MOV CL,TOTALE CICLOX: ADD AL,VETTORE[BX] INC BX LOOP CICLOX MOV SOMMA,AX RET CALCOLO ENDP ;------------------------------------------------------------ PARIV PROC NEAR XOR DX,DX LEA DX,MSG3 CALL VISUAL CALL INPUT_N XOR AX,AX XOR BX,BX XOR CX,CX MOV CL,TOTALE CICLOP: MOV AL,VETTORE[BX] MOV BX,2 DIV BX CMP AH,0 JNE FINE LOOP CICLOP MOV PARI,AX FINE: RET PARIV ENDP
;------------------------------------------------------------ OUTPUT PROC NEAR PUSH AX PUSH DX LEA DX,MSG1 ;'LA SOMMA è= $' CALL VISUAL ;stampa stringa puntata da DS:DX mediante INT 21h,09h MOV AX,SOMMA CALL STAMPA_N ;stampa il risulato LEA DX,ACCAPO ;passaggio alla riga successiva CALL VISUAL POP DX POP AX RET OUTPUT ENDP ;------------------------------------------------------------------------- ;Input di numero decimale < 256 (byte)da tastiera: in AL Input_N PROC NEAR PUSH BX PUSH CX PUSH DX XOR AX,AX ;Inizializza AX MOV CX,5 ;Lettura di massimo 5 caratteri Ciclo1: CALL Char_N ;Input di un carattere ASCII in DL CMP DL,13 ; INVIO = DEC 13 in ascii JE VerificaB ;E' stato premuto INVIO? SUB DL,'0' ;Conversione ASCII-numero MUL dieci ;AX <- dieci * AL ADD AL,DL LOOP Ciclo1 ;salta se meno di cinque cifre VerificaB: CMP AX,256 JB Fuori ;E' stato effett letto un byte? LEA DX,msgx ;puntatore del messaggio in DX CALL VISUAL ;Stampa la stringa puntata da DX XOR AH,AH CALL Stampa_N ;Stampa del byte utilizzato Fuori: LEA DX,accapo ;Passaggio alla riga successiva CALL VISUAL ;Stampa la stringa puntata da DX POP DX POP CX POP BX RET Input_N ENDP ;-------------------------------------------- ;Input da tastiera di cifra '0'..'9','INVIO', resa in DL Char_N PROC NEAR PUSH AX Ripeti: MOV AH,1 INT 21h MOV DL,AL CMP DL,13 JE Char_N_Ok ;E' stato premuto INVIO? CMP DL,'0' JB Indietro ;Il carattere è < '0'? CMP DL,'9' JBE Char_N_Ok ;Il carattere <= '9'? Indietro: PUSH BX MOV AH,3 ;servizio 3:acquisizione cursore MOV BH,0 ;pagina 0 INT 10h ;DH riga DL colonna DEC DL MOV AH,2 ;servizio 2:definizione cursore INT 10h POP BX JMP Ripeti ;rilegge il carattere Char_N_Ok: POP AX RET Char_N ENDP ;------------------------------------------------- ;------------------------------------------------------------------- ;la proceduta VISUAL stampa la stringa puntata da DS:DX mediante INT 21h,09h VISUAL PROC NEAR PUSH AX MOV AH,9 INT 21H POP AX RET VISUAL ENDP ;------------------------------------------------------------------------- ;la procedura STAMPA_N scrive a video il valore di AX come stringa di cifre STAMPA_N PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,0 ;inizializza il numero di cifre CICLO2: MOV DX,0 DIV DIECIW ADD DX,'0' PUSH DX ;salvataggio cifra INC CX CMP AX,0 JNE CICLO2 ;ci sono altre cifre? MOV AH,2 CICLO3: POP DX INT 21H LOOP CICLO3 POP DX POP CX POP BX POP AX RET STAMPA_N ENDP ;----------------------------------------------------------------------------- MAIN ENDP CODE ENDS END MAIN
|
| silent |
Inserito il - 14/06/2005 : 16:36:20 ma per la prova di laboratorio la prof. de carolis mette già a disposizione le subroutine di lettura e scrittura di un byte,o le dobbiamo scrivere noi ?? |
| silent |
Inserito il - 31/05/2005 : 16:38:40 grazie xoom |
| M]i[K |
Inserito il - 31/05/2005 : 15:28:24 io l'ho fatto l'anno scorso con la deCarolis, e mise di immettere un vettore di numeri da tastiera e dovevi prima ordinare il vettore di numeri, e poi avere come output due messaggi, uno che ti dicceva il numero dei numeri pari del vettore, e l altro messaggio diceva il numero dei dispari.
Al secondo turno, che fece il mio amico invece, mise di immettere un vettore di numeri, e di invertirli con un altro vettore di numeri gia dato da lei però.
Spero di esserti stao utile..in bocca al lupo  |
| silent |
Inserito il - 31/05/2005 : 11:46:23 qualcuno che ha sostenuto la prova di laboratorio può postare la traccia ?? |
| axelgenus |
Inserito il - 28/05/2005 : 12:21:04 Citazione: Messaggio inserito da mrluglio
non è che per caso dividi per 0
No, non era quello il problema. Comunque ho risolto da solo, grazie!  |
| mrluglio |
Inserito il - 28/05/2005 : 11:02:16 non è che per caso dividi per 0 (poi nn so...è solo un suggerimento) |
|
|