Einzelnen Beitrag anzeigen

OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#1

Delphi Inline Assembler Zugriff auf Privates Objekt

  Alt 17. Nov 2003, 13:28
Hallo Gemeinde!

Folgende Methode bereitet mir leichte Bauchschmerzen:

Delphi-Quellcode:
Function TDIBSection24.GetMaskValue(X,Y:DWord):Byte;
asm // eax = Self; edx = X; ecx = Y
    push ebx
    cmp [eax].FMask, 0
    je @NoMaskValue // Keine Maske definiert
    // X-Wert anpassen und überprüfen
    mov ebx, [eax].FMaskRect.Left
    sub edx, ebx // X-Offset der Maske berücksichtigen
    js @NoMaskValue // X < 0 -> ausserhalb der Maske
    mov ebx, [eax].FMask // Zeiger auf FMask Object
    cmp edx, [ebx+$08] // ebx + $08 = FMask.FWidth
    jge @NoMaskValue // X >= Width -> ausserhalb der Maske
    add edx, [ebx+$04] // Zeiger auf Byte X, 0
    // Y-Wert überprüfen und anpassen
    mov edi, [eax].FMaskRect.Top
    sub ecx, edi // Y-Offset der Maske berücksichtigen
    js @NoMaskValue // Y < 0 -> ausserhalb der Maske
    cmp ecx, [ebx+$0C] // X >= FMask.FHeight -> ausserhalb der Maske
    jge @NoMaskValue
    jecxz @FirstRow
    imul ecx, [ebx+$08] // Y-Offset nur bei Y > 0
    add edx, ecx
  @FirstRow:
    mov eax, [edx]
    and eax, $000000FF
    jmp @EndFunc
  @NoMaskValue:
    xor eax, eax // Result = 0
  @EndFunc:
    pop ebx
End;
Ich bekomme keinen direkten Zugriff auf die privaten Variablen des Objektes FMask über den Punktoperator. Die Anweisung [eax].FMask.FWidth wird vom Compiler nicht korrekt aufgelöst. So bleibt mir nur der Umweg über mov ebx, [eax].FMask den Zeiger auf das Objekt zu ziehen und den Offset zu FWidth direkt über [ebx+$04] zu setzen. Hab auch schon diverse Casting Varianten ausprobiert; leider ohne Erfolg. Vielleicht gibt es doch eine Lösung, denn so ist der GAU vorprogrammiert, wenn ich die privaten Variablen der Klasse TDIBMask ändere.

Vielen Dank für´s mitdenken.

Gruss

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat