Adressierungsproblem



  • Hi, ich steh gerad ein wenig im Dunkeln.
    Ich hab ein 2-dimensionales Array sagen eine 4*3 Matrix.
    Nun will ich die Adresse eines bestimmente Elements in der Matrix.
    Nur wie komme ich da jetzt dran.

    Ich habs mal mit

    mov esi, [ebp + 28 + ebx * 8 + ecx * 8]

    versucht, wobei Spalte bzw Zeile in EBX und ECX stehen sollen.
    Aber der * geht dabei nicht.
    Gibts da einen Ausweg?

    Ich bedanke mich schonmal! 🙂



  • Nehmen wir an, das Array sieht so aus (4*3):

    array db 41h, 42h, 43h, 44h
          db 45h, 46h, 47h, 48h
          db 49h, 4Ah, 4Bh, 4Ch
    

    Um von der Adresse 'Array' zu einem Feld zu gelangen müssen wir 'Zeile*4' und 'Spalte' hinzuaddieren. Wobei bei (0,0) angefangen wird. Im Beispiel wäre 47h also in Zeile 1 und Spalte 2. Das heißt: Adresse = Array + Zeile*4 + Spalte = Array + 1*4 + 2 = Array + 6. Und Array + 6 ist ja genau die Adresse der 47h. Wenn in ebx die Zeile und in ecx die Spalte steht, lautet der Befehl so:

    mov esi, [array+ebx*4+ecx]
    


  • mal etwas anders erklaert:

    Wenn die Dimensionen Deiner Matrix und der dazugehoerige Datentyp bekannt sind,
    kannst Du die Adressen waerend des Assemblierens ausrechnen lassen.

    Kleines Beispiel fuer marix 3*4 (dd):

    DIM2 equ 3
    
        D4x3 macro a, b
        (a*DIM2+b)*(sizeof dd)
        endm
    
       .data 
    
            matrix  dd 4*3 dup (0)
            ...
       .code
    
       mov esi, D4x3(1, 2)+ offset matrix ; entspricht Pseudocode C: mov esi,&matrix[1][2]
       ...
       ;dto.
       mov edi, offset matrix
       mov esi, [edi+D4x3(1,2)]
    

    mfg


Anmelden zum Antworten