![]() |
Re: Verdrehte Bits (Wilde Pointereien)
Meine Codes sind nur Beispiele. Ich habe nicht geschrieben, das dies so 1:1 übernommen werden muss. Je nach Anwendunsfall, bzw. je nach dem Code der vor und nach dem asm-Block steht muss man sich selbst raus suchen was man selbst benötigt.
|
Re: Verdrehte Bits (Wilde Pointereien)
Zitat:
Zitat:
Zitat:
|
Re: Verdrehte Bits (Wilde Pointereien)
Übrigens verstehe ich auch bei mehrmaligem Lesen des Zitats noch immer, daß man bestimmte Register zwar frei ändern kann, dort steht aber nirgends, daß die automatisch für dich gesichert und wiederhergestellt werden. Also vielleicht doch mal lieber durch einen Disassembler jagen und nachprüfen.
|
Re: Verdrehte Bits (Wilde Pointereien)
Zitat:
Die Register müssen nicht gesichert werden, da der Inhalt, der vor dem asm-Block drin war nach dem asm-Block nicht weiter verwendet wird. |
Re: Verdrehte Bits (Wilde Pointereien)
Ich möchte hier nur mal passend anmerken, dass man sich auf den oben zitierten Hilfetext zu den zu sichernden Registern nicht verlassen, wenn die Optimierung eingeschaltet ist. Ich habe dadurch schon öfters massive Probleme bekommen, weil die Optimierung zugeschlagen hatte und z.B. EAX auf einmal auch nicht mehr verändert werden durfte (anders gesagt: gesichert werden musste).
Auch vergisst die Hilfe seit je her zu erwähnen, dass man das Direction Flag im Flagsregister möglichst nicht umändern soll. Delphi zeigt da öfters mal die feste Überzeugung, dass niemand anders dieses Flag ändert und von daher setzen viele Codes das Flag nie explizit. (Dieses trifft sogar schon ohne eingeschaltete Optimierung zu!) |
Re: Verdrehte Bits (Wilde Pointereien)
Zitat:
Zitat:
1. "EDI, ESI, ESP, EBP und EBX" keinesfalls antatschen 2. "EAX, ECX und EDX" darfst du. 3. Der zweite rote Teil suggeriert, daß du sehr wohl die Register (aus 2.) sichern mußt. Man kann es nicht deutlich genug machen. Der Text besagt nichts darüber, wie die Werte vor oder nach dem asm-Block sind oder sein sollen, sondern wie sie innerhalb des Blocks zu sein haben. BTW: #18 fand ich einfach goldig :mrgreen: :mrgreen: :mrgreen: |
Re: Verdrehte Bits (Wilde Pointereien)
Ok, ich denke wir sind an einem Punkt, der viel Interprätations Spielraum lässt.
Zitat:
1. Du kannst dich nicht darauf verlassen, dass z.B. in EAX schon ein bestimmter Wert steht. Das mache ich auch nicht, da ich EAX einen Wert im asm-Block zuweise. 2. Du kannst dich nicht darauf verlassen, dass wenn du den Wert in EAX später noch brauchst, dass er dann noch in EAX steht. Mache ich auch nicht, da ich EAX nur innerhalb des asm-Block verwende. 3. Es muss nicht gesichert werden. Gut, wenn jetzt in der Onlinehilfe Müll steht, kann ich natürlich nichts machen. Zu deinem 1. : Du darfst sie schon antasten, nur dann vorher sichern. |
Re: Verdrehte Bits (Wilde Pointereien)
Ich gebe mich geschlagen.
|
Re: Verdrehte Bits (Wilde Pointereien)
In der OH ist klar erwähnt, wie Parameter übergeben werden und wie Ergebnisse zurückkommen müssen. Der erste Parameter ist IMMER in EAX (außer bei Methodenaufrufen, wie schon erwähnt), Results werden IMMER in EAX zurückgegeben (bei 32-Bit-Werten).
Also ist das bisher gepostete
Delphi-Quellcode:
das kürzest- und schnellstmögliche Konstrukt. Wenn das ganze in einer Methode verpack ist, genügt eine weitere Zeile:
function SwapBytes (Source: DWORD): DWORD;
asm // This is not written as mnemonics to be compatible with D4! db 0Fh, 0C8h // "bswap EAX" can only be executed on 486+!!! end;
Delphi-Quellcode:
Ab Delphi 2006 kann man anstelle des "db 0Fh, 0C8h" auch direkt "BSWAP" schreiben.
function TMyObject.SwapBytes (Source: DWORD): DWORD;
asm mov eax,edx db 0Fh, 0C8h end; |
Re: Verdrehte Bits (Wilde Pointereien)
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz