Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-05-2009, 18:11   #1
pol88884
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
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2009, 19:49   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 23:07   #3
pol88884
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
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 15:50   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 18:42   #5
pol88884
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
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 19:14   #6
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:33.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 11:41   #7
pol88884
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
Ma comunque continua ad uscire il 65 in AL e mi da un messaggio di errore:

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.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 11:49   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 12:00   #9
pol88884
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.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 12:06   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da pol88884 Guarda i messaggi
Esce sempre 65 in AL e 0 in AH sia durante la somma che durante la divisione.
Cosa vuol dire "esce"?
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 12:27   #11
pol88884
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.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 11:45   #12
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:33.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 12:11   #13
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 12:19   #14
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:34.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 12:23   #15
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da rеpne scasb Guarda i messaggi
Vero (anche se e' possibile che qualche assemblatore rappresenti il segmento dati con 'DATA'), ma allora se la variabile DATA (non @DATA), non esiste come fa il linker a generargli l'eseguibile? Perche' vale 0h?
Magari esiste...
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 12:31   #16
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:34.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 17:12   #17
pol88884
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 27
Ciao, si chiama emu8086 (www.emu8086.com)
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 17:34   #18
pol88884
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 27
Quote:
Se non si conosce che tipo di assemblatore usa, si puo' dire tutto quello che si vuole. A naso direi di trasformare la riga:

Codice:
data segment
in
Codice:
data segment byte 'DATA'
Ho provato a sostituirla ma non cambia molto.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 18:01   #19
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Codice:
MOV AX,@Data
E questo l'hai provato?
__________________
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 18:13   #20
pol88884
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 27
Si, ma il risultato non cambia.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Zeekr debutta in Italia con Jameel Motor...
Robotaxi sotto controllo remoto: Waymo a...
Ubisoft continua i tagli: 40 licenziamen...
PromptSpy: il primo malware Android che ...
Navigare all'estero con costi accessibil...
Boom del fotovoltaico in Africa: +54% in...
Cisco mette l'IA agentica al centro con ...
Volete una microSD da 400GB SanDisk a me...
Artemis II: il razzo spaziale NASA SLS e...
A volte basta poco: via muffa e umidit&a...
4 portatili con 32GB di RAM e 1TB di SSD...
Frenata sull'intesa tra NVIDIA e OpenAI:...
Sony chiude Bluepoint Games dopo la canc...
Pos, addio per sempre agli scontrini: ec...
Google presenta Gemini 3.1 Pro: adesso p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v