MATRICE nell' x8086?

di il
6 risposte

MATRICE nell' x8086?

Salve,ho problemi nell'inserire una matrice, cioè quando la stampo alcuni valori non sono corretti, ovvero diversi da quelli che ho inseriti. Ad esempio nel mio caso ho una mat 2x2 e se inserisco 5 4 3 1, stampa : 5 4 4 1. Ecco il codice:

.MODEL MEDIUM
.STACK 100H
.DATA
MAT DB 2*2 DUP(?)  
DOM DB 'INSERISCI',13,10,'$' 
.CODE
.STARTUP      


  MOV AX,@DATA
  MOV DS,AX
  
 
  MOV SI,0 ;contatore i
  MOV BX,0 ;contatore j
  
CICLO1:
        MOV BX,0
        CICLO2:
               MOV AH,09H
               MOV DX,OFFSET DOM
               INT 21H
               
               MOV AH,01H
               INT 21H
               MOV MAT[SI][BX],AL  ;inserisco elemento in posizione [si][bx]
               
               INC BX ;incremento bx
               CMP BX,2
               JL  CICLO2
               INC SI
               CMP SI,2
               JL CICLO1
               
          MOV SI,0
          MOV BX,0
;stampo
     CICLO3:
        MOV BX,0
        CICLO4:
               
               
               MOV AH,02H 
               MOV DL,MAT[SI][BX]
               INT 21H
              
               
               INC BX
               CMP BX,2
               JL  CICLO4
               INC SI
               CMP SI,2
               JL CICLO3
               
               
               MOV AH,4CH
               INT 21H
               
   END
             

6 Risposte

  • Re: MATRICE nell' x8086?

    E no, gli array non funzionano come nel C che fa internamente il calcolo, tramite gli indici, della locazione di memoria da utilizzare nell'array.

    In assembly i due registri non sono indici ma semplici valori che sono sommati e rappresentano una locazione di memoria. Quando scrivi

    MOV MAT[SI][BX],AL

    è come se scrivessi

    MOV MAT[SI+BX],AL

    e quindi ottieni la locazione in cui scrivere (a partire da MAT) all'indirizzo BX+SI.

    Quindi se BX=0 SI=1 oppure BX=1 SI=0 vai a scrivere nella stessa locazione.

    Dunque devi calcolare tu la posizione esatta in base al valore degli "indici" e di quanto è grande una riga.
  • Re: MATRICE nell' x8086?

    oregon ha scritto:


    E no, gli array non funzionano come nel C che fa internamente il calcolo, tramite gli indici, della locazione di memoria da utilizzare nell'array.

    In assembly i due registri non sono indici ma semplici valori che sono sommati e rappresentano una locazione di memoria. Quando scrivi

    MOV MAT[SI][BX],AL

    è come se scrivessi

    MOV MAT[SI+BX],AL

    e quindi ottieni la locazione in cui scrivere (a partire da MAT) all'indirizzo BX+SI.

    Quindi se BX=0 SI=1 oppure BX=1 SI=0 vai a scrivere nella stessa locazione.

    Dunque devi calcolare tu la posizione esatta in base al valore degli "indici" e di quanto è grande una riga.
    Si, in effetti hai ragione. Ho provato a fare un LEA BX,MAT e poi trattare la matrice come MAT[BX][SI], ma si impalla durante l'inserimento . Il prof ci ha dato questo esemmpio , ma lo ha fatto con valori costanti e non so neanche se funziona sinceramente,fatto sta che vorrei farlo con inserimento da tastiera e stamparlo poi:
    
    ...
    .Data
    RIGHE EQU 4
    COLONNE EQU 4
    
    MAT DW RIGHE*COLONNE DUP(?)
    ..
    .CODE
    LEA BX,MAT
    MOV CX,RIGHE*COLONNE
    INIZ:   MAT[BX][SI],AX
              ADD SI,2
              CMP SI,COLONNE*2
              JNE LOOPALO
              INC AX
              ADD BX,COLONNE*2
              MOV SI,0
    LOOPALO:
                       LOOP INIZ
    
    
  • Re: MATRICE nell' x8086?

    oregon ha scritto:


    E no, gli array non funzionano come nel C che fa internamente il calcolo, tramite gli indici, della locazione di memoria da utilizzare nell'array.

    In assembly i due registri non sono indici ma semplici valori che sono sommati e rappresentano una locazione di memoria. Quando scrivi

    MOV MAT[SI][BX],AL

    è come se scrivessi

    MOV MAT[SI+BX],AL

    e quindi ottieni la locazione in cui scrivere (a partire da MAT) all'indirizzo BX+SI.

    Quindi se BX=0 SI=1 oppure BX=1 SI=0 vai a scrivere nella stessa locazione.

    Dunque devi calcolare tu la posizione esatta in base al valore degli "indici" e di quanto è grande una riga.
    Mi correggo , ho risolto in questo modo. Va bene? O è stata fortuna? Ci sarebbe un modo per renderlo più simile al C?
    
    .MODEL MEDIUM
    .STACK 100H
    .DATA
    MAT DB RIGHE*COLONNE DUP(?)
    RIGHE EQU 2
    COLONNE EQU 2  
    DOM DB 'INSERISCI',13,10,'$' 
    .CODE
    .STARTUP      
    
    
      MOV AX,@DATA
      MOV DS,AX
      
     
     LEA BX,MAT
     MOV CX,RIGHE*COLONNE
      
    CICLO1:
            
                   MOV AH,09H
                   MOV DX,OFFSET DOM
                   INT 21H
                   
                   MOV AH,01H
                   INT 21H
                   MOV MAT[BX][SI],AL 
                   
                   ADD SI,1
                   CMP SI,COLONNE
                   JNE  CICLO2
                   ADD BX,COLONNE
                   MOV SI,0
           CICLO2:
                     LOOP CICLO1 
                     
            MOV BX,0
            MOV CX,0       
           MOV SI,0 
           LEA BX,MAT
           MOV CX,RIGHE*COLONNE  
        CICLO3:
            
               
                   
                   MOV AH,02H
                   MOV DL,MAT[BX][SI] 
                    INT 21H 
                    
                   ADD SI,1
                   CMP SI,COLONNE
                   JNE  CICLO4
                   ADD BX,COLONNE
                   MOV SI,0
           CICLO4:
                     LOOP CICLO3 
                   
                   
                   MOV AH,4CH
                   INT 21H
                   
       END
                 
    
    
  • Re: MATRICE nell' x8086?

    Hai fatto una

    LEA

    e poi usi comunque

    MAT[ ....

    ??
  • Re: MATRICE nell' x8086?

    oregon ha scritto:


    Hai fatto una

    LEA

    e poi usi comunque

    MAT[ ....

    ??
    Per trattare la matrice come tanti vettori messi in riga, o almeno cosi ci hanno spiegato
  • Re: MATRICE nell' x8086?

    Se usi la LEA allora devi scrivere

    MOV MAT[BX][SI],AL

    perché se inserisci la MAT non riempi correttamente la memoria (l'indirizzo sarà MAT+MAT+SI)

    Fra l'altro nell'esempio del prof che hai fornito nella linea

    INIZ: MAT[BX][SI],AX

    manca l'istruzione MOV ... forse era

    INIZ: MOV [BX][SI],AX
Devi accedere o registrarti per scrivere nel forum
6 risposte