Manipolare Matrice x86

di il
11 risposte

Manipolare Matrice x86

Salve a tutti, mi sono da poco affacciato nel mondo dell'assembly per necessità, devo svolgere un esercizio che prevede operazioni con le matrici.

Ad esempio, come creo in Assembly un programma che mi calcoli la somma degli elementi di una riga compresi tra due indici di colonna?

So che la matrice può essere linearizzata ed è gestibile come un array..

11 Risposte

  • Re: Manipolare Matrice x86

    Ma tu cosa proponi? Non hai provato a scrivere nulla?
  • Re: Manipolare Matrice x86

    Ciao, ti ringrazio innanzi tutto per aver considerato il mio thread

    Io più o meno ho cercato di scrivere qualcosa ma non so in realtà come poter gestire le matrici, so che va linearizzata, e che viene trattata come un array e che quindi il "gioco" è basato su indici...

    Se mi dai qualche linea guida magari provo a farlo seguendo i tuoi consigli...
  • Re: Manipolare Matrice x86

    X infoluca
    allora vediamo cosa sai degli array e delle matrici
    secondo te c'è differenza tra queste 2 strutture ?
    struttura a:

    abcd
    efgh
    ijkl
    mnop

    struttura b:
    abcdefghijklmnop

    rispondimi a questa semplice domanda e in base a ciò che mi rispondi, se ti va, ti aiuto.
  • Re: Manipolare Matrice x86

    Ciao, grazie per l'interesse...

    Le due forme in Assembly dovrebbero essere del tutto equivalenti, ed entrambi rappresentano una matrice linearizzata...giusto?

    Comunque mi sto imbattendo in un esercizio con le matrici:

    L'esercizio chiede di calcolare la somma degli elementi compresi tra due indici di riga i1 e i2 di una matrice di qualsiasi dimensione nxm

    L'esercizio richiede di creare una procedura che effettui questo calcolo e il programma vero e proprio che richiama la procedura.
  • Re: Manipolare Matrice x86

    Capito che devi fare l'esercizio e capito le difficoltà ma un inizio di codice lo hai impostato o no?

    Vuoi *tutto* il codice dell'esercizio dal forum o possiamo vedere solo quello che non sai fare?
  • Re: Manipolare Matrice x86

    Allora
    per la definizione devi usare una di queste direttive
    db se vuoi considerare i dati byte
    dw se vuoi considerare i dati word
    dd se vuoi usare le double word
    per quanto riguarda l'indicizzazione devi usare un registro tipo bx,si,di se lavori a 16 bit mentre se lavori a 32 bit devi usare un registro tipo ebx,esi,edi.
    come sapere quale indice usare ?
    semplice se voglio fare il prodotto tra mat[1,3] e mat[3,5]
    matrice 4*6
    prima mi calcolo i 2 indici
    indice di mat[1,3] = 2 perchè gli array in assembler cominciano da 0
    quindi 1-1 = 0 3 = 2 siccome in assembler si comincia a contare da 0 (0,1,2) ecco perchè 2
    indice di mat[3,5] = ((3-1) * 6) + 5 = 16 vedi scritta in rosso per capire perchè = 16

    adesso gli elementi per fare l'esercizio te li ho dati scrivi il codice e se vuoi lo correggiamo.
  • Re: Manipolare Matrice x86

    Piccolo chiarimento e correzione

    mat[1,3] = ((1-1) * 6) + (3-1) = 2

    mat[3,5] = ((3-1) * 6) + (5-1) = 16

    in generale

    mat[r,c] => ((r-1) * maxcol) + (c-1)

    e tieni presente la grandezza del dato utilizzato ...
  • Re: Manipolare Matrice x86

    Vi ringrazio per il vostro interesse, ci avevo perso le speranze, e mi scuso per il ritardo della risposta ma non sono stato a casa in questi giorni.

    Ho provato a buttar giù qualche riga di codice, ma non vi nascondo che ho molte lacune sull'assembly, per ora ho lasciato stare la procedura, concentrandomi prima sul "succo del programma" e considerando per l'appunto una matrice 4*6 come suggeritomi da Smalldragon

    vi prego di non linciarmi per l'"obrorio" che sto per postarvi
     
    .MODEL SMALL
    .SMACK 100H
    .DATA
    MAT DW =1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
    IND1=5
    IND2 = 3
     SOMMA=0
      XOR BX,BX    ; AZZERO BX CHE USO PER L'INDICE DI RIGA
      XOR CX,CX      ;  // STESSA COSA PER L'INDICE DI COLONA
      XOR ESI,ESI      ;// IONDICE DI CONTROLLO
      XOE DX,DX
     .CODE
     .STARTUP
    
     CICLORIGHE:
                      CMP BX, RIGHE
                      JGE FINE
                      
                  CILOCOLONNE:
                              CMP CX,COLONNE
                              JGE PROSSIMARIGA
                              
                    VERIFICAESTREMO1:  CMP BX,IND1
                                       JGE PROSSIMARIGA 
                    VERIFICAESTREMO2:  CMP BX,IND2
                                       JGE ACCUMULA
                    ACCUMULA:                                ;CALCOLO INDICE DELL'ELEMENTO
                                        DEC BX
                                        MUL BX,COLONNE
                                        DEC CX
                                        MOV DX,BX
                                        ADD DX,CX  ;DX DOVREBBE CONTENERE L'INDICE CORRETTO DELL'ELEMENTO
                                        ADD SOMMA, [MAT[DX]]  ; CREDO SIA UN ORRORE  :(
                                        ;RIPRISTINO BX INCREMENTANDOLO  COME ERA INIZIALMENTE E RIPRISTINO CX
                                        DIV BX,COLONNE
                                       
                                        INC BX
                                        INC CX
                                        INC CX
                                        JMP CICLOCOLONNE
                    PROSSIMARIGA:
                    INC BX
                    JMP CICLORIGHE
                    FINE:
                     MOV AX,SOMMA
                     INT 21H
  • Re: Manipolare Matrice x86

    Manca la parte dei dati a cui si riferisce il codice ...

    DOv'è la matrice?
  • Re: Manipolare Matrice x86

    Scusami hai ragione. Ho corretto il codice inserendo la parte che mancava... XD
  • Re: Manipolare Matrice x86

    Devi controllare quello che scrivi

    .SMACK ?

    XOE ?

    ESI ?

    E le variabili RIGHE e COLONNE dove sono?

    MOV AX,SOMMA
    INT 21H
    ??

    Che ci fanno quelle XOR fuori dal codice?

    L'hai mai compilato ed eseguito? Hai visto gli errori che sono evidenziati?
Devi accedere o registrarti per scrivere nel forum
11 risposte