|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
[assembler 8086] Aiuto calcolo media
Ciao a tutti, sempre per quanto riguarda i problemi sull'assembler 8086, ho provato a fare questo esercizio, ma non esce.
Dice così: - Scrivere un programma assembler che calcoli la media di 4 cifre (0..9) inserite in un vettore definito nel segmento dati. Quando vado a vedere nel registro di AL mi da come risultato 0 invece di 4, mentre nel registro AH mi 66 invece di resto 0. Dove sbaglio? Questo è il codice: Codice:
; calcolo media di 4 cifre (0..9) inserite in un vettore definito nel segmento dati
data segment
numeri db 4 dup (2,2,2,2) ; cifre definite di cui calcolare la media
due db 1 dup(2); dividendo
somma db 0
data ends
code segment
assume CS:CODE,SS:STACK,DS:DATA
inizioprogramma:
MOV AX,DATA
MOV DS,AX
MOV AX,0; inizializzo ax
MOV SI,0; inizializzo il contatore si
MOV BX,offset numeri; carico l'offset nel vettore BX
sommatot:
CMP SI,4
JE dividi; se si e' uguale a 4 salta a dividi
MOV AL,byte ptr[bx+si] ; sposto i numeri a ogni ciclo in AX
ADD somma,AL;somma i quattro numeri definiti nel segmento dati
INC SI; incrementa il contatore si
JMP sommatot ;salta sempre a sommatot
dividi:
MOV AX,SOMMA; sposto il totale della somma in AX
DIV DUE ; divido AX:DUE
code ends
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ciao
Ho trovato i seguenti: - Errore concettuale: Devi calcolare la media di 4 numeri e dividi per 2. - memoria: Somma e' un byte solo, non puoi caricarlo in AX (e l'errore mi sa che deriva da qui) a meno che... - logica: Perche' accumuli dentro "somma", invece che tenere direttamente dentro AL, ovviamente cambiando qualcosina, se li' ti serve alla fine per la divisione?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ciao ho provato a modificare quelle parti, ma mi da sempre numeri strani. In AH ora mi da 65 e in AL mi da 0.
Qui inserisco il codice: Codice:
; calcolo media di 4 cifre (0..9) inserite in un vettore definito nel segmento dati
data segment
numeri db 4 dup (2,2,2,2) ; cifre definite di cui calcolare la media
quattro db 1 dup(4); dividendo
data ends
code segment
assume CS:CODE,SS:STACK,DS:DATA
inizioprogramma:
MOV AX,DATA
MOV DS,AX
MOV AX,0; inizializzo ax
MOV SI,0; inizializzo il contatore si
MOV BX,offset numeri; carico l'offset nel vettore BX
sommatot:
CMP SI,4
JE dividi; se si e' uguale a 4 salta a dividi
ADD AL,byte ptr[bx+si] ; sommo i numeri
INC SI; incrementa il contatore si
JMP sommatot ;salta sempre a sommatot
dividi:
DIV quattro ; divido AX:QUATTRO
code ends
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
mi sa che e' sbagliata la dichiarazione degli array e dei valori.
Non usare dup, che non ti serve, semplicemente metti i valori che ti servono direttamente numeri db 4,5,7,8 divisore db 4 dup serve per ripetere contenuti identici piu' volte, cosa che non dovrebbe appunto servirti (soprattutto per il divisore)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ho modificato quelle parti, ma non va. Ho notato comunque che in AL e in AH escono sempre gli stessi numeri ovvero 65 e 0 sia durante la somma che durante la divisione e anche cambiando i valori. Potrebbe essere che sbaglio a puntare a data?
Inserisco il codice: Codice:
; calcolo media di 4 cifre (0..9) inserite in un vettore definito nel segmento dati
data segment
numeri db 2,2,2,2 ; cifre definite di cui calcolare la media
quattro db 4; dividendo
data ends
code segment
assume CS:CODE,SS:STACK,DS:DATA
inizioprogramma:
MOV AX,DATA
MOV DS,AX
MOV AX,0; inizializzo ax
MOV SI,0; inizializzo il contatore si
MOV BX,offset numeri; carico l'offset nel vettore BX
sommatot:
CMP SI,4
JE dividi; se si e' uguale a 4 salta a dividi
ADD AL,byte ptr[bx+si] ; sommo i numeri
INC SI; incrementa il contatore si
JMP sommatot ;salta sempre a sommatot
dividi:
DIV quattro ; divido AX:QUATTRO
code ends
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:33. |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ciao ho applicato quella modifica:
Codice:
; calcolo media di 4 cifre (0..9) inserite in un vettore definito nel segmento dati
data segment
numeri db 2,2,2,2 ; cifre definite di cui calcolare la media
quattro db 4; dividendo
data ends
code segment
assume CS:CODE,SS:STACK,DS:DATA
inizioprogramma:
MOV AX,DATA
MOV DS,AX
MOV AX,0; inizializzo ax
MOV SI,0; inizializzo il contatore si
MOV BX,offset numeri; carico l'offset nel vettore BX
sommatot:
CMP SI,4
JE dividi; se si e' uguale a 4 salta a dividi
ADD AL,byte ptr[bx+si] ; sommo i numeri
INC SI; incrementa il contatore si
JMP sommatot ;salta sempre a sommatot
dividi:
DIV ds:byte ptr[quattro] ; divido AX:QUATTRO
code ends
Codice:
divide error - overflow. to manually process this error, change address of INT 0 in interrupt vector table Ultima modifica di pol88884 : 25-05-2009 alle 11:44. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Prova a debuggare un po'
Ad esempio prova a vedere quanto vale AX prima della divisione, poi prova a dividere direttamente per 4 invece che per una locazione di memoria, (ovvero puoi caricare direttamente 4 in un registro come CL e dividere per quello)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Esce sempre 65 in AL e 0 in AH sia durante la somma che durante la divisione.
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Cosa hai fatto per vedere in un qualunque momento il valore di AL e AH?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Mi correggo vado nel menù debug e vedo singoli step per vedere i passaggi che fa il programma.
Nella finestra dei registri ho notato che non mi fa la somma tra le variabili, esce direttamente 70 in AL inserisco delle foto dei risultati: http://img198.imageshack.us/my.php?image=debug2g.jpg http://img5.imageshack.us/img5/2504/debug3b.jpg qui invece va da 70 a 71: http://img40.imageshack.us/img40/9340/debug4.jpg infine nell'ultimo ciclo di ADD AL,byte ptr[bx+si] va direttamente a 65: http://img38.imageshack.us/img38/1739/debug5.jpg Non capisco il perchè Ultima modifica di pol88884 : 25-05-2009 alle 18:37. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:33. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
E' un po' che non scrivo direttamente codice ASM per DOS.
Ma non era Codice:
MOV AX,@Data
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:34. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
nel sorgente la prima parola e' proprio data segment e magari data senza @data vale 0, ovvero il primo indirizzo disponibile per i dati nel segmento, dato che non c'e' alcuna direttiva di spiazzamento (mi sembra fosse la direttiva org)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:34. |
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ciao, si chiama emu8086 (www.emu8086.com)
|
|
|
|
|
|
#18 | |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Quote:
|
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Codice:
MOV AX,@Data
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#20 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Si, ma il risultato non cambia.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:02.




















