AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphi Inline Assembler Zugriff auf Privates Objekt
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Inline Assembler Zugriff auf Privates Objekt

Ein Thema von OLLI_T · begonnen am 17. Nov 2003 · letzter Beitrag vom 18. Nov 2003
 
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, 12: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz