Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
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


Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
I satelliti spia russi Kosmos 2613 e Kos...
GTA VI: online la nuova mega galleria co...
Edits, l'app di Instagram, sbarca gratis...
Claude Code: il bug che ha spedito l'ema...
Perplexity lancia Teammates, gli agenti ...
Niente più datacenter? Gli eletto...
La Cina avrebbe approvato lo sviluppo de...
Epson EF-72 alla prova: Google TV, audio...
AST SpaceMobile annuncia il razzo spazia...
Apple taglia il budget AI dei dipendenti...
Fisco e intelligenza artificiale, come c...
Synology BC510 e CC410W, la videosorvegl...
600.000 chip NVIDIA fermi a Hong Kong: l...
La Cina punta tutto sull'allunaggio con ...
LG Italia compie 30 anni: gli italiani v...
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: 22:18.


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