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 5 von 5   « Erste     345   
OlafSt

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 4. Sep 2007, 11:21


Ich empfehle, das ganze mal in Delphi einzugeben, zu kompilieren und dann mal den Assemblercode anzuschauen. Und vielleicht wirfst du auch mal einen Blick in die OH zum Thema Inline-Assembler. Dann wird dir auffallen:

- Das der Parameter "Source" vor dem Call in das EAX-Register geladen wird
- Dann der Call in die Routine stattfindet:

  SwapBytes($00800081);
Delphi-Quellcode:
  
mov eax,$00800081
call SwapBytes
- Die Routine SwapBytes nur das Register EAX (und sonst kein anderes) verändert
- Das Ergebnis nach Verlassen der Routine in EAX erwartet wird.

Wozu dann noch unnötige Ladeoperationen mit EAX ?

Mein zweites Beispiel berücksichtigt nur, das bei Methodenaufrufen der Objektzeiger als erster Parameter übergeben wird (und, wie sich das gehört, landet der erste Parameter in EAX), der zweite Param landet dann in EDX. Da wir das Ergebnis eh in EAX brauchen, lade ich es von EDX nach EAX und mache dann ein BSWAP EAX - in Anlehnung an die einzeilige Version.

Natürlich hätte ich auch BSWAP EDX, gefolgt von MOV EAX,EDX machen können.

Zitat:
Mein Delphi 7 kann das auch schon.
Ich bitte um Verzeihung, das ich keine gesteigerte Lust hatte, mein Delphi 7 hochzufahren und auszuprobieren, ob der Inline-Assembler von D7 bereits BSWAP beherrscht. Ich halte es lieber mit dem Motto "Wenn ich's nicht genau weiß, sag ich nichts".
  Mit Zitat antworten Zitat
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 4. Sep 2007, 13:31
Ich glaube, wir reden aneinander vorbei.

Zitat:
- Das der Parameter "Source" vor dem Call in das EAX-Register geladen wird.
Das ist das doch was ich die ganze Zeit sage.

Ich sehe immer noch nicht die unnötige Ladeoperation. In deinem Code taucht das "MOV EAX,***" auf und in meinem Code statt dessen "MOV EDX,***". Wo ist da der Unterschied, ausser das ein anderes Register geladen wird. Die CPU führt beide Befehle gleich schnell aus. Ich sehe aber immer noch ein unnötiges "CALL".
Delphi-Quellcode:
mov eax,$00800081
call SwapBytes
Eines muss ich dazu noch sagen: Das "Swapen" tauch nur einmal in meinem gesamten Programm auf.
Deswegen : Warum das in eine Funktion packen, wenn ich es auch mitten in den Code packen kann.

Noch einmal die Gegenüberstellung
Delphi-Quellcode:

   Meins Deins
   Zahl := $12345678; Zahl := $12345678;
   asm Zahl := SwapBytes(Zahl);
     mov edx, Zahl; // mov eax, Zahl // bei dir von Delphi generiert
                                    // call SwapBytes
                                    asm // Dieser Block ist in deiner Funktion
     bswap edx; bswap eax;
                                      // Rücksprung aus Funktion
                                      ret; // ich hoffe das heisst so auf einem 8086
                                    end;
     mov Zahl, edx; // mov Zahl, eax; // bei dir von Delphi generiert
   end;
   // jetzt ist bei beiden Varianten die Variable Zahl gedreht
Ich sehe es nicht wo dein Code kürzer oder schneller sein sollte.

Zitat:
Ich empfehle, das ganze mal in Delphi einzugeben, zu kompilieren und dann mal den Assemblercode anzuschauen.
Kann Delphi den Asm-Code selbst ausgeben? Ich habe keinen Disassembler installiert.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#43

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 4. Sep 2007, 14:05
Einen Haltepunkt einfügen und im angehaltenen Zustand alt+strg+c drücken (Delphi 2005). Sonst eben mal das Menü durchforsten, die Ansicht heißt "CPU".
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#44

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 4. Sep 2007, 14:23
Zitat von Quake:
Delphi-Quellcode:

   Meins Deins
   Zahl := $12345678; Zahl := $12345678;
   asm Zahl := SwapBytes(Zahl);
     mov edx, Zahl; // mov eax, Zahl // bei dir von Delphi generiert
                                    // call SwapBytes
                                    asm // Dieser Block ist in deiner Funktion
     bswap edx; bswap eax;
                                      // Rücksprung aus Funktion
                                      ret; // ich hoffe das heisst so auf einem 8086
                                    end;
     mov Zahl, edx; // mov Zahl, eax; // bei dir von Delphi generiert
   end;
   // jetzt ist bei beiden Varianten die Variable Zahl gedreht
Berücksichtigt Delphi eigentlich solche sachen, wenn man manuelle die Register verändert?
ich pushe und pope die register immer auf den stack, die ich verändere, und ich nicht weiss, ob nicht delphi die selber braucht ...

[edit]ok, kommando zurück, hätte mir vorher den ganzen thread mal durchlesen sollen ...
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
OlafSt

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 4. Sep 2007, 14:55
@Quake: Wir reden hier wirklich aneinander vorbei

im Verlaufe des Threads ist im Kopf hängengeblieben, das das ganze in eine Funktion ausgelagert wurde (dein RET an der Stelle ist überflüssig und sogar gefährlich. Den Rücksprung besorgt Delphi durch das "end;" von allein). Dann genügt die eine Zeile, wie ich es schrieb.

Mitten im Programmcode, wie in deinem Falle, hast du natürlich recht. Wie sich das ganze verhält, wenn wir "inline" ins Spiel bringen, werde ich jetzt nicht ausführen...

Was deinen Codeschnipsel angeht: Es wäre interessant zu sehen, ob "Zahl" nicht schon in einem Register liegt - dann wären die MOV's wieder überflüssig und wir hätten wieder nur eine Zeile Code. Grundsätzlich empfiehlt sich ein PUSH/POP um solcherlei "handcrafted" Code, wie @Apollonius schon bemerkte. Kann aber durchaus entfallen, wenn es die allerletzten Zeilen in der Funktion sind.

Ach ja, das CPU-Fenster gibt es IIRC seit Delphi 3 (dort nur mit Registry-Hack) und ist erreichbar über ALT+8
  Mit Zitat antworten Zitat
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 4. Sep 2007, 17:15
Zitat:
(dein RET an der Stelle ist überflüssig und sogar gefährlich. Den Rücksprung besorgt Delphi durch das "end;" von allein). Dann genügt die eine Zeile, wie ich es schrieb.
Da hast du mich auch falsch verstanden. Ich wollte nur verdeutlichen, was bei deiner Methode ausgeführt wird. Da die Funktion mit einem CALL aufgerufen wird muss sie auch mit einem RET (ist RET überhaupt richtig?) beendet werden. Das fügt Delphi natürlich auch selbst hinzu. Du hast Recht, das man das RET auf jeden Fall hier nicht selbst hinzufügen darf.

Zitat:
Es wäre interessant zu sehen, ob "Zahl" nicht schon in einem Register liegt
Das würde der OH widersprechen.

Zitat:
Zu Beginn der Ausführung einer asm-Anweisung ist der Registerinhalt unbekannt.
Es währe natürlich zufällig möglich.

Für mich stellt sich nur die Frage, kann man der OH trauen? Ihr scheint ja alle sehr misstrauisch zu sein.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 5   « Erste     345   


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 17:40 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