Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
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


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...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
Stop Killing Games: Ross Scott convince ...
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: 21:45.


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