ASSEMBLY 8086 ESERCIZIO SU VETTORE

di il
8 risposte

ASSEMBLY 8086 ESERCIZIO SU VETTORE

Salve a tutti, premetto che il mio programma riscontra dei problemini in fase di debug e sono agli inizi dello studio di questo linguaggio, volevo sapere se fosse possibile qualche correzione, grazie in anticipo.

in breve il testo dell'esercizio sarebbe questo :

Per farla breve op2 è un vettore di i elementi
mentre op1 di un solo elemento, devo scansionare e poi comparare ogni elemento di op2 con op1 se lo trova mettere l'indice i (io ho messo 1, i lo metto da cx?)
altrimenti se non trovo niente lascio in r8 cioè DX =0

mentre quello originale

testo esercizio :

SCANVEC op1,op2 .

L’operando op1 `e di registro, e contiene un dato a 16 bit (i registri general purpose della macchina sono 8, ma solo i registri {R1, . . . R7} sono utilizzabili per op1). L’operando
op2 `e un vettore di n interi a 16 bit, espresso con modalità di indirizzamento diretto di memoria oppure indiretto di registro.
Il numero n `e contenuto nel registro (implicito)R8.

L’istruzione cerca il dato op1 nel vettore op2, a partire dal suo primo elemento: se lo trova, pone in R8 l’indice i ? [1, n] dell’elemento che corrisponde e termina, altrimentitermina dopo avere posto in R8 il valore 0.
Esempi di sintassi: SCANVEC R3,vect;SCANVEC R5,[R4].
Allegati:
20721_dbde267c0b1a26afe842950d35af0b4e.png
20721_dbde267c0b1a26afe842950d35af0b4e.png

8 Risposte

  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    Non basta dare tutto e attendere un volontario ... devi indicare chiaramente i malfunzionamenti, cosa succede e cosa pensi possa essere, magari anche indicare i tuoi sospetti su precise parti del codice...

    Poi é meglio copiare il codice non mettere uma immagine
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    Sì, mi scuso non sono molto pratico. Praticamente all'istruzione MOV BH, O E MOV BL, VAL il debugger mi da problemi e penso sia un errore di teoria, poi non mi torna MOV SI,OFFSET VECT E MOV AL, [SI] E CMP BL, AL non sono sicuro sia giusto, per fare il confronto tra l'elemento del vettore op1 e l'iesimo elemento di op2
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    Ciao
    potresti indicare gli errori che ti posta il compilatore?
    comunque a prescidere dagli errori di compilazione
    l'istruzione mov al,[esi] andrà sempre in errore perchè il registro è a 8 bit metre l'operando è a 16 bit!
    per ovviare a questo devi porre la specifica di trattamento e quindi l' istruzione diventa:
    mov al,byte ptr [esi]
    poi ti consiglo invece di usare :
    add si,1
    sub cl,1
    
    usa
    inc si
    dec cx ; oppure dec cl
    perchè sono più immediate.
    il ciclo di per se va bene!
    conosci l'istruzione loop?
    spero di esserti stato di aiuto
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    smalldragon ha scritto:


    Ciao
    potresti indicare gli errori che ti posta il compilatore?
    comunque a prescidere dagli errori di compilazione
    l'istruzione mov al,[esi] andrà sempre in errore perchè il registro è a 8 bit metre l'operando è a 16 bit!
    per ovviare a questo devi porre la specifica di trattamento e quindi l' istruzione diventa:
    mov al,byte ptr [esi]
    poi ti consiglo invece di usare :
    add si,1
    sub cl,1
    
    usa
    inc si
    dec cx ; oppure dec cl
    perchè sono più immediate.
    il ciclo di per se va bene!
    conosci l'istruzione loop?
    spero di esserti stato di aiuto
    Ti ringrazio per la risposta, ho fatto come mi hai detto. metto qui il codice
     .MODEL SMALL
    .STACK 100H
    .DATA
        N DB 7H        ;NUMERO ELEMENTI DI UN VETTORE
        VAL DB 4H       ;VALORE DI OP1 DA CONFRONTARE CON TUTTI GLI ELEMENTI DI VECT
        VECT DB 1,2,3,4,5,6,7 ;I VALORI DI VECT 
    .CODE
    .STARTUP
             MOV AX, @DATA
             MOV DS, AX
                    
             XOR DX,DX ;RISULTATO CHE VA MESSO IN R8
             XOR CX,CX ; CONTATORE
             
             MOV BX, VAL ; VALORE DI OP1
             MOV SI,OFFSET VECT
             
    CICLO:  MOV AX,[SI]           
                CMP BX,AX ;valore dell'iesimo di op2 con op1
                JE TROV     ;trovato sono uguali
                INC SI         ;non trovato vado avanti 
                INC CX       ;incremento contatore
                CMP CX,N ; CONFRONTO con n
                JE NOTROV  ;SCANSIONATO TUTTO NON TROVATO
                JMP CICLO;ALTRIMENTI
             
    TROV:  MOV DX,CX ; METTO IN R8 IL CONTENUTO DI CX
    NOTROV: NOP
    
             MOV AH, 4CH
             INT 21H         ;RESTITUISCO IL CONTROLLO AL DOS
    END                      ;TERMINO IL PROGRAMMA
    
    
    
    purtroppo i puntatori non li ho fatti, va bene lo stesso se confronto bx con ax ?
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    Ciao
    credo che l'esercizio serva a farti imparare come si gestisca l'indirizzamento alla memoria.
    comunque il confronto di perse va bene ma il problema:
        
             MOV BX, VAL ; VALORE DI OP1 (non si può fare perchè hai un registro a 16 bit mentre val è definito come un byte)
             MOV SI,OFFSET VECT ; ok
      CICLO:  MOV AX,[SI] ;qui ti serve un byte o una word ?       
    
    quello che dovresti fare è :
    
    xor bx,bx
    mov bl,val
    mov si,offset vect
    xor ax,ax 
    ciclo: mov al,byte ptr [si] 
    cmp ax,bx
    .......
    ;resto va bene
    
    allora per spiegarti:
    XOR BX,BX ;CANCELLA IL REGISTRO QUINDI AVREMO BH=0 BL=0
    MOV BL,VEL ;CARICHIAMO IL VALORE DI VECT IN BL QUINDI AVREMO BH=0 BL=VALORE DI VAL.
    MOV SI,OFFSET VECT ;SI=LOCAZIONE DI INIZIO vettore
    XOR AX,AX ; CANCELLO REGISTRO AX E NECESSARIA PERCHE' IN QUESTO MOMENTO AX=indirizzo SEGMENTO DATI. MENTRE NOI VOGLIAMO UTILIZZARLO PER IL CONFRONTO.
    CICLO: MOV AL,BYTE PTR [SI] ;SIGNIFICA PRENDI UN DATO DALLA LOCAZIONE DI MEMORIA INDICIZATA DA SI E METTILO IN AL AVREMO AH=0 AL=DATO
    CMP AX,BX ; CONFRONTA I REGISTRI AX E BX AVREMO AH=0 AL=DATO BH=0 BL=VAL
    spero che hai capito
    se c'è qualcosa che non ti è chiaro chiedi pure
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    Ti ho lasciato un altro errore da trovare per capire se hai capito!
    con le spiegazioni che ti ho dato lo dovresti trovare facilmente.
    ricordati che
    i registri ax,bx,cx,dx,di,si trattano dati word cioe' 2 byte esempio 0102 per questi registri è un unico dato!
    mentre ah,al,bh,bl,ch,cl,dh,dl trattano dati byte esempio di byte 01 per loro è un dato
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    smalldragon ha scritto:


    Ti ho lasciato un altro errore da trovare per capire se hai capito!
    con le spiegazioni che ti ho dato lo dovresti trovare facilmente.
    ricordati che
    i registri ax,bx,cx,dx,di,si trattano dati word cioe' 2 byte esempio 0102 per questi registri è un unico dato!
    mentre ah,al,bh,bl,ch,cl,dh,dl trattano dati byte esempio di byte 01 per loro è un dato
    
    .MODEL SMALL
    .STACK 100H
    .DATA
        N DB 7        ;NUMERO ELEMENTI DI UN VETTORE
        VAL DB 4       ;VALORE DI OP1 DA CONFRONTARE CON TUTTI GLI ELEMENTI DI VECT
        VECT DB 1,2,3,4,5,6,7 ;I VALORI DI VECT 
    .CODE
    .STARTUP
             MOV AX, @DATA
             MOV DS, AX
                    
             XOR DX,DX ;RISULTATO CHE VA MESSO IN R8
             XOR CX,CX ; CONTATORE
             
             MOV BL, VAL ; VALORE DI OP1       
             MOV SI, OFFSET VECT      ;SI=LOCAZIONE DI INIZIO VETTORE     
             XOR AX,AX  ;CANCELLO REGISTRO AX E NECESSARIA PERCHE' IN QUESTO MOMENTO AX=indirizzo SEGMENTO DATI. MENTRE NOI VOGLIAMO 		 
                                 UTILIZZARLO PER IL CONFRONTO.
             
    CICLO:   MOV AL,BYTE PTR[SI]    ;MI SERVE UN BYTE NON UNA WORD USO PUNTATORE
             CMP BX,AX
             JE TROV
             INC SI
             INC CL                    
             CMP CL,N ; 
             JE NOTROV  ;SCANSIONATO TUTTO NON TROVATO
             JMP CICLO;ALTRIMENTI
             
    TROV:  MOV DX,CX ; METTO IN R8 IL NUMERO DELL'ELEMENTO DEL VETTORE
    NOTROV: NOP
    
             MOV AH, 4CH
             INT 21H         ;RESTITUISCO IL CONTROLLO AL DOS
    END                      ;TERMINO IL PROGRAMMA
    Ti ringrazio tantissimo per la spiegazione, adesso è tutto molto molto più chiaro, facevo confusione fra i registri a 8bit e a 16bit, penso che l'altro errore sia
    CMP CX,N
    dato che non posso fare il confronto fra un registro a 16 bit con un byte, sarebbe dovuta essere una word.

    Ho modificato il programma per quanto riguarda l'uso del registro CX in quanto il testo richiede di mettere in che posizione si trova il numero trovato in un registro(io ho scelto DX) e quindi ho fatto CX che parte da zero e che si incrementa ad ogni ciclo. In realtà dovrei fare che parte da n e si decrementa, ma non mi viene in mente come tenere traccia di i, come potrei fare per aggiustarlo?

    Il programma non da problemi in fase di compilazione nè di debug e controllando i valori dei registri tutto torna perfettamente, quindi grazie ancora
  • Re: ASSEMBLY 8086 ESERCIZIO SU VETTORE

    Ciao
    si l'errore era quello!
    allora se ho capio bene hai 2 problemi:
    1) devi decrementare invece di incrementare?
    2) non sai cosa devi mettere in dx quando trovi la corrispondenza?
    soluzione problema 1:
    conosci l'istruzione loop?
    soluzione problema 2:
    hai più di una soluzione :
    perchè ho fai:
    
    push si ;SALVI SULLO STACK L'OFFSET DEL VETTORE
    JMP CICLO
    TROV:  MOV DX,si ; METTO IN R8 La posizione del vettore
    mov cx,1 ; QUESTO TI SERVE PER FAR FINIRE IL CICLO PRIMA DEL TEMPO.
    jmp fine_ciclo    
    CICLO:   MOV AL,BYTE PTR[SI]    ;MI SERVE UN BYTE NON UNA WORD USO PUNTATORE
             CMP BX,AX
             JE TROV
             INC SI
    FINE_CICLO:
             LOOP CICLO
         POP SI ; RIPRENDI L'OFFSET DEL VETTORE
         CMP DX,0
         JE NONTROV
         SUB DX,SI ; POSIZIONE VETTORE =  POSIZIONE DATO TROVATO - OFFSET VETTORE
         ....
         ....
    

    oppure
    TROV:  MOV Dl,cl ; METTO IN R8 La posizione del vettore
    mov cx,1 ; QUESTO TI SERVE PER FAR FINIRE IL CICLO PRIMA DEL TEMPO.
    jmp fine_ciclo 
    CICLO:   MOV AL,BYTE PTR[SI]    ;MI SERVE UN BYTE NON UNA WORD USO PUNTATORE
             CMP BX,AX
             JE TROV
             INC SI
    FINE_CICLO:
             LOOP CICLO
       CMP DX,0
         JE NONTROV
    sub dl,N
    neg dx
    ......
    
    e la medesima cosa.
    spero di averti dato gli elementi per risolvere i problemi.
    manca ancora una cosa prima della chiamata al ciclo sta a te trovare cosa manca.
    se ti va posta tutto il codice che hai scritto cosi posso controllarlo.
Devi accedere o registrarti per scrivere nel forum
8 risposte