Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo
Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo
Find X9 Ultra è lo smartphone che tanti aspettavano, e finalmente è arrivato anche in Italia. Abbiamo provato il flagship di OPPO per diverse settimane, e siamo volati fino in Cina alla sua presentazione ufficiale. Tutto gira intorno al suo incredibile comparto fotografico in collaborazione con Hasselblad e con un totale di sei fotocamere. Il resto è un mix di specifiche di altissimo livello, così come il prezzo. Vi raccontiamo tutto nella nostra recensione completa.
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-05-2009, 17: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, 18: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, 22: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, 14: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, 17: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, 18:14   #6
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 15:33.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 10: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 10:44.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2009, 10: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, 11: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, 11: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, 11: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 17:37.
pol88884 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 10:45   #12
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

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

Ultima modifica di rеpne scasb : 18-06-2012 alle 15:34.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 11: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, 11:31   #16
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 15:34.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 16: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, 16: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, 17: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, 17: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


Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo Recensione OPPO Find X9 Ultra: è lui il c...
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Il rover NASA Curiosity ha scoperto oltr...
Il satellite AST SpaceMobile BlueBird 7 ...
SpaceX: la droneship Just Read the Instr...
Project Helix sarà prodotta anche...
La NASA pubblica alcuni aggiornamenti su...
Tute spaziali AxEMU per Artemis: Axiom S...
Nutanix Government Cloud Clusters arriva...
Troy Baker lavora a un progetto tutto su...
Motorola Edge 60 Neo è il compatt...
Stretto di Hormuz, finti funzionari iran...
Dragon Ball Xenoverse 3 annunciato uffic...
WINDTRE BUSINESS potenzia i servizi IoT ...
OPPO rinnova l'ecosistema: arrivano Watc...
OPPO Find X9 Ultra ufficiale: debutta il...
Renault Twingo: esposta a Milano per far...
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: 00:34.


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