Calcolo della media non funziona!(ASSEMBLY x86)

di il
15 risposte

Calcolo della media non funziona!(ASSEMBLY x86)

Salve ragazzi..ho da poco iniziato a studiare l' assembly x86 e utilizzo emu8086 per provare le procedure. Sono proprio a zero quindi ho iniziato con qualche programmino facile facile ma già ci sono i primi problemi..se potreste aiutarmi a trovare gli errori in questo che dovrebbe servire a calcolare la media, facendo la somma di tutti gli elementi del vettore maggiori di zero...Grazie milleee
; PROCEDURA CHE CALCOLI IL VALOR MEDIO DEI NUM POSITIVI DI UN VETT DI INTERI CON SEGNO
LUNG EQU 10      
.model small

data segment
VETT DW LUNG DUP 1,2,3,4,5,6,7,8,9,10
COUNT DB ?
RES DB ? ; VARIABILE CHE CONTERRA' IL RISULTATO
ends
code segment
start:
MOV CX,LUNG 
MOV SI,0;SI LO USO COME INDICE DI SCORRIMENTO
MOV BX,0;IN SI VADO A CONSERVARE LA SOMMA TOT TROVATA FINO AD ADESSO 
MOV COUNT,0;CONTATORE DEGLI ELEMENTI SOMMATI 
 ;INIZIO UN LOOP CHE DECREMENTANDO CX CONTINUERA' PER TUTTA LA LUNG DEL VETTORE
CICLO:     CMP VETT[SI],0 ;CONFRONTO OGNI ELEMENTO CON 0
           JNG CONT ; SE NON E' MAGGIORE VA A CONTINUA
           INC COUNT;SE E' MAGG INCREMENTA IL CONTATORE
           ADD BX,VETT[SI] ;AGGIUNGO A BX IL VALORE  
CONT :     ADD SI,2
           LOOP CICLO
           MOV AX,BX; SPOSTO IL RIS IN AX PERCHE' LA DIVISIONE SI PUO' FARE SOLO IN AX
           DIV COUNT;DIVIDO LA SOMMA TOT CONTENUTA IN AX PER IL NUM DI ELEM SOMMATI
           MOV RES,AL;IN AL C'E' LA PARTE PIU BASSA DEL RISULTATO DELLA DIVISIONE
           ;LA VARIABILE PUO' CONTENERE UN BYTE QUINDI HO UNA LIMITAZIONE NEL 
           ;CARICARE IL RISULTATO 
           ADD BYTE PTR RES,30H
           MOV AH,2
           INT 21H 
ends

end start  

15 Risposte

  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Ok, ma il problema in particolare qual è ?
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Il programma e compilato senza errori ma al run time esegue il ciclo loop infinite volte finchè non chiudo io la pagina anzichè fermarsi quando ha scorso tutta la lunghezza del vettore decrementando il CX....e stampare il valore trovato..grazie per la risposta
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Siamo sicuri che resti nel ciclo?

    In realtà dopo la ultima INT 21 cosa c'è? Il programma non può finire in quel modo ...
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Devo aggiungere
    mov ax, 4c00h
    int 21h
    per terminare il programma oppure INT 20h direttamente ..giusto? ho provato ad eseguire uno step alla volta e in pratica dal LOOP in poi inizia da capo e così via...come se mancasse qualcosa alla fine del ciclo.
    Poi ho un dubbio sull' istruzione RET ..ho trovato che "L'istruzione RET organizza il ritorno al programma chiamante al termine di una procedura, cioè un sottoprogramma chiamato con CALL..."ecc ecc.. quindi in questo caso non avendo nessuna CALL da terminare non l' ho messa ,però cercando esempi ,spunti sul web ho visto che alcune volte viene usata lo stesso dopo l'int 20h per terminare il programma..ho un "po' " di confusione.
    grazie mille : )
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Posso appprofittare della tua pazienza? :p dato che sto incontrando non poche difficoltà nello studiare da internet..sapresti consigliarmi qualche buon manuale pratico su cui studiare? ho acquistato il bucci per calcolatori elettronici buono per la teoria, ma la parte di assembly è praticamente inesistente...prima di fare qualche acquisto inutile ..ci sono consigli?:)
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Nel tuo codice manca l'impostazione del registro di segmento dei dati, all'inizio

    start:
    MOV AX,@data
    MOV DS,AX

    Per la RET no, se non c'è la CALL, in generale non va usata. La terminazione corretta per tornare al Sistema Operativo è la prima con la INT21 ...

    Per i libri, purtroppo su Assembly 8086 (vecchio) c'è veramente poco ...
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Grazie mille : ) ora mi stampa un simpaticissimo punto e virgola,ma almeno si ferma dopo 10 scorrimenti ..il loop funziona è già un passo avanti
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Ovviamente ... se il valore binario che trasformi in ASCII è compreso tra 0 e 9 otterrai il carattere corretto ... da 10 in poi il carattere ASCII non sarà corretto e la conversione sarà un pelino più complicata (dovrai separare le due cifre, decine e unità ...)
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Sisi infatti ..però per provare se funzionava con un intero ad una sola cifra...per semplificare ho fatto
    VETT DW LUNG DUP 1,1,1,1,1,1,1,1,1,1 così il risultato dovrebbe essere 1..
    poi ho letto che quando si chiama l'interruzione int 21h e si vuole eseguuire la funzione 02h il carattere da scrivere lo troviamo in DL quindi ho fatto così
    
    MOV DL,RES
    ADD DL,30H
    MOV AH,02H
    INT 21H 
    ma mi stampa il solito ";"....grazie mille ancora
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Guarda che hai inserito 10 "uno" nella lista non 9 e comunque deve essere

    LUNG EQU 9

    e

    VETT DW 1,1,1,1,1,1,1,1,1

    non come hai scrito tu.

    Inltre non c'è motivo di usare RES. Il risultato è in AL quindi basta un

    MOV DL,AL

    e subito dopo

    ADD DL,30H
    MOV AH,02H
    INT 21H
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Si scusami :S ricapitolando:
    
    LUNG EQU 9     
    .model small
    data segment
    VETT DW LUNG DUP 1,1,1,1,1,1,1,1,1
    COUNT DB ?
    ends 
    code segment
    start:   
    MOV AX,@data
    MOV DS,AX
    MOV CX,LUNG 
    MOV SI,0
    MOV BX,0
    MOV COUNT,0
    CICLO:     CMP VETT[SI],0 
               JNG CONT 
               INC COUNT
               ADD BX,VETT[SI] 
    CONT :     ADD SI,2
               LOOP CICLO  
               MOV AX,BX
               DIV COUNT
               MOV DL,AL
               ADD DL,30H
               MOV AH,02H
               INT 21H
               MOV AX,4C00H
               INT 21h 
    
    ends 
    end start
    
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Quindi ?
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Mi stampa il solito ";"
  • Re: Calcolo della media non funziona!(ASSEMBLY x86)

    Ma non hai fatto le modifiche che ti avevo indicato ... leggi con attenzione il mio messaggio con le indicazioni
Devi accedere o registrarti per scrivere nel forum
15 risposte