AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verdrehte Bits (Wilde Pointereien)

Ein Thema von Phoenix · begonnen am 16. Aug 2007 · letzter Beitrag vom 4. Sep 2007
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#31

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 21:35
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#32

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 21:36
Zitat von Quake:
Onlinehilfe :
Zitat:
Registerverwendung

Im Allgemeinen sind die Regeln für die Verwendung von Registern in einer asm-Anweisung identisch mit denjenigen für eine external-Prozedur oder -Funktion. In einer asm-Anweisung muss der Inhalt der Register EDI, ESI, ESP, EBP und EBX erhalten bleiben, während die Register EAX, ECX und EDX beliebig geändert werden können. Beim Eintritt in eine asm-Anweisung zeigt EBP auf den aktuellen Stackframe, ESP auf den Beginn des Stacks. Zu Beginn der Ausführung einer asm-Anweisung ist der Registerinhalt unbekannt. Eine Ausnahme bilden die Register ESP und EBP.
Dann will ich nichts gesagt haben. In dem Fall sollte es gehen. Ich habe nur eben kein Delphi installiert.

Zitat von Quake:
Zitat:
Überflüssig wäre das ganze hinundherkopieren, weil du das bei dem Aufruf einer anderen Funktion nicht brauchst.
Dann kannst du mir auch bestimmt erklären, wieviel Zeit Verschwendet wird, bei einmal eine Variable hin und her kopieren im Gegensatz zu einem Funktionsaufruf.
Nein, kann ich nicht, weil das vom Prozessor und da vom Modell usw. abhängt. Das ändert sich ständig, weshalb sogenannte "Optimierungen" mit Assembler meist gröbster Unsinn sind. Im Falle von BSWAP haben wir eine Ausnahme, weil dort eine Instruktion die Arbeit von mehreren Zeilen HLL-Code macht.

Zitat von Quake:
Was macht Delphi wohl automatisch wenn eine Funktion aufgerufen wird? Ich gehe mal davon aus, zum einen Unmengen von Daten hin und her kopieren, und zum anderen eine Bereichsüberprüfung.
Und genau da irrst du bei einer Funktion, die kein begin/end, sondern asm/end hat. Dort passiert nämlich nichts dergleichen.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#33

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 21:54
Ü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.
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#34

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 21:57
Zitat:
Und genau da irrst du bei einer Funktion, die kein begin/end, sondern asm/end hat. Dort passiert nämlich nichts dergleichen.
Aber da ich mal davon ausgehe, dass die Funktion trotzdem mit einem call oder sowas aufgerufen wird, hättest du trotzdem nichts gewonnen, und irgendwie muss der Wert ja mal in das EAX Register gelangen. Ob ich das jetzt mache, oder Delphi automatisch ist wohl egal.

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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#35

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 22:41
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!)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#36

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 22:41
Zitat von Quake:
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.
Hallo? Was ist das denn für ein ausgemachter Unfug? Woher willst du das wissen? Das kann man erst nach einer Analyse in einem Disassembler mit Bestimmtheit sagen und dann auch nur für das aktuelle Kompilat. Kann sich bei einer kleinen Codeänderung schon gewaltig ändern.

Zitat:
Im Allgemeinen sind die Regeln für die Verwendung von Registern in einer asm-Anweisung identisch mit denjenigen für eine external-Prozedur oder -Funktion. In einer asm-Anweisung muss der Inhalt der Register EDI, ESI, ESP, EBP und EBX erhalten bleiben, während die Register EAX, ECX und EDX beliebig geändert werden können. Beim Eintritt in eine asm-Anweisung zeigt EBP auf den aktuellen Stackframe, ESP auf den Beginn des Stacks. Zu Beginn der Ausführung einer asm-Anweisung ist der Registerinhalt unbekannt. Eine Ausnahme bilden die Register ESP und EBP.
Da steht exakt drin:
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
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#37

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 23:22
Ok, ich denke wir sind an einem Punkt, der viel Interprätations Spielraum lässt.

Zitat:
Zu Beginn der Ausführung einer asm-Anweisung ist der Registerinhalt unbekannt.
Das bedeutet für mich:
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#38

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 23:46
Ich gebe mich geschlagen.
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#39

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 3. Sep 2007, 13:41
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:
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;
das kürzest- und schnellstmögliche Konstrukt. Wenn das ganze in einer Methode verpack ist, genügt eine weitere Zeile:

Delphi-Quellcode:
function TMyObject.SwapBytes (Source: DWORD): DWORD;
asm
  mov eax,edx
  db 0Fh, 0C8h
end;
Ab Delphi 2006 kann man anstelle des "db 0Fh, 0C8h" auch direkt "BSWAP" schreiben.
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#40

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 3. Sep 2007, 16:03
Zitat:
das kürzest- und schnellstmögliche Konstrukt.
Nur weil du in deinen Code kein "mov eax,irgendwas" schreibst heist es noch lange nicht, dass Delphi dies nicht automatisch hinzufügt. Nochmal, was meinst du woher der Wert im EAX Register kommt? Ohne Befehl kann der Wert nicht im EAX Register landen, ob nun von dir hinzugefügt oder von Delphi automatisch.

Zitat:
Ab Delphi 2006 kann man anstelle des "db 0Fh, 0C8h" auch direkt "BSWAP" schreiben.
Mein Delphi 7 kann das auch schon.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 02:21 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