Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verdrehte Bits (Wilde Pointereien) (https://www.delphipraxis.net/97815-verdrehte-bits-wilde-pointereien.html)

Quake 2. Sep 2007 14:48

Re: Verdrehte Bits (Wilde Pointereien)
 
Nur mal als Hinweis, weil ich mich auch gerade damit rumschlage.

(Edit : Damit das hier nicht falsch stehen bleibt änder ich das mal.)
Die CPUs, die auf der Intel Architektur (8086) basieren, legen das niederwertigste Byte zuerst im Speicher ab.
Im Gegensatz dazu legen die CPUs, die auf der Motoroler Architektur (6800) basieren, das höstwertigste Byte zuerst im Speicher ab.

Deswegen ist Delphi doch manchmal ein ganz schöner Krampf. Bei meiner Anwendung, die ich im Moment schreibe, kommt es nähmlich auch auf die Geschwindigkeit an.

Noch eine Sache zu dem "ULONG" das kommt von unsigned long, die C++ler werden damit eher was anfangen können.

Mit dem Inlineassembler habe ich noch nicht so richtig verstanden,da ich damit noch nicht gearbeitet habe. Vieleicht kann mir da ja noch jemand helfen. Ich habe jetzt mitten in einer Procedure eine Variable "w: longword;", wie bekomme ich diese Variable jetzt in dass EAX Register und das Ergebniss wieder Zurück in meine Variable?

Christian Seehase 2. Sep 2007 15:13

Re: Verdrehte Bits (Wilde Pointereien)
 
Moin Quake,

Zitat:

Zitat von Quake
Die CPUs, die auf der Intel Architektur (8086) basieren, legen das höstwertigste Byte zuerst im Speicher ab.
Im Gegensatz dazu legen die CPUs, die auf der Motoroler Architektur (6800) basieren, das niederwertigste Byte zuerst im Speicher ab.

Umgekehrt ;-)

Intel arbeite mit Little-Endian, Motorola mit Big-Endian.

Quake 2. Sep 2007 15:24

Re: Verdrehte Bits (Wilde Pointereien)
 
Ups :oops: Du hast natürlich Recht. Habe ich oben mal schnell geändert :stupid: .

OK, habe mir das schon selbst beantwortet: (Beispiel ist eine vereinfachte Version)

Delphi-Quellcode:
procedure xyz(Zahl: longword);
var
  l: longword;
begin
  l := Zahl;
  asm
    mov eax, l;
    bswap eax;
    mov l, eax;
  end;
  Zahl := l;
end;

Olli 2. Sep 2007 16:00

Re: Verdrehte Bits (Wilde Pointereien)
 
Zitat:

Zitat von Quake
Mit dem Inlineassembler habe ich noch nicht so richtig verstanden,da ich damit noch nicht gearbeitet habe. Vieleicht kann mir da ja noch jemand helfen. Ich habe jetzt mitten in einer Procedure eine Variable "w: longword;", wie bekomme ich diese Variable jetzt in dass EAX Register und das Ergebniss wieder Zurück in meine Variable?

Indem du den entsprechenden Namen der Variablen oder deren Stackposition ansprichst?!

Wo hakt es denn genau?

Das Ergebniss wird übrigens bei einem 32bit-Wert oder Pointer oder weniger als 32bit (Boolean) in EAX zurückgegeben.

Quake 2. Sep 2007 16:38

Re: Verdrehte Bits (Wilde Pointereien)
 
Danke für dein Angebot der Hilfe, aber ich habe es schon hin bekommen. (siehe oben)

Ich habe aber noch eine kleine Abänderung gemacht, jetzt mit einem Pointer. (wieder die Vereinfachte Version)

Delphi-Quellcode:
procedure xyz(Zahl: longword);
var
  p: ^longword;
begin
  .
  .
  .
  p := @Zahl;
  asm
    mov edx, p;
    mov eax, [edx];
    bswap eax;
    mov [edx], eax;
  end;
  .
  .
  .
end;
Eine Frage habe ich doch noch. Dies könnte ich doch auch in ein Macro packen, oder? Wie erstelle ich nur ein Macro?

Olli 2. Sep 2007 16:44

Re: Verdrehte Bits (Wilde Pointereien)
 
Zitat:

Zitat von Quake
Danke für dein Angebot der Hilfe, aber ich habe es schon hin bekommen. (siehe oben)

Ich habe aber noch eine kleine Abänderung gemacht, jetzt mit einem Pointer. (wieder die Vereinfachte Version)

Delphi-Quellcode:
procedure xyz(Zahl: longword);
var
  p: ^longword;
begin
  .
  .
  .
  p^ := @Zahl;
  asm
    mov edx, p;
    mov eax, [edx];
    bswap eax;
    mov [edx], eax;
  end;
  .
  .
  .
end;

Hmpf ... nicht gut. Ich sehe, daß du die Zahl nicht zurückgeben willst, also wird sie vermutlich nach dem Assemblerblock verarbeitet. Nur als kleiner Tip, meine Funktion von oben sollte deutlich effektiver sein. Warum? Weil du überflüssige Dinge machst und mal davon abgesehen auch noch riskant. Was passiert mit EDX und EAX vor und nach dem Assemblerblock? Weißt du nicht? Richtig! Also müssen sie gesichert werden!

Delphi-Quellcode:
// Siehe dein Code
  p^ := @Zahl;
  asm
    push edx
    push eax
    mov edx, p;
    mov eax, [edx];
    bswap eax;
    mov [edx], eax;
    pop eax
    pop edx
  end;

Quake 2. Sep 2007 16:54

Re: Verdrehte Bits (Wilde Pointereien)
 
Zitat:

Was passiert mit EDX und EAX vor und nach dem Assemblerblock?
Da hast du wohl Recht, aber ich habe irgendo eben gelesen, dass das Delphi auch egal ist. Andere Register wie z.B. ESP, EDI usw. müssen dagegen auf jeden Fall gesichert werden. Ausserdem funktioniert mein Code so wie ich ihn da stehen habe.
Edit: Hab nochmal nachgeschaut, in der Delphi-Hilfe steht das so drin.

Zitat:

Weil du überflüssige Dinge machst
Wo mache ich was überflüssig?

Zitat:

Hmpf ... nicht gut. Ich sehe, daß du die Zahl nicht zurückgeben willst, also wird sie vermutlich nach dem Assemblerblock verarbeitet.
Ja, der Code oben sollte nur ein Ausschnitt aus meinem Code sein.

Olli 2. Sep 2007 17:23

Re: Verdrehte Bits (Wilde Pointereien)
 
Zitat:

Zitat von Quake
Da hast du wohl Recht, aber ich habe irgendo eben gelesen, dass das Delphi auch egal ist. Andere Register wie z.B. ESP, EDI usw. müssen dagegen auf jeden Fall gesichert werden. Ausserdem funktioniert mein Code so wie ich ihn da stehen habe.
Edit: Hab nochmal nachgeschaut, in der Delphi-Hilfe steht das so drin.

Das ist schön. Zitiere doch bitte mal den ganzen Absatz hier, weil ich mir ziemlich sicher bin, daß du bei einer Funktion, welche nicht komplett in Inline-ASM geschrieben ist, auch die Register sichern mußt.

Überflüssig wäre das ganze hinundherkopieren, weil du das bei dem Aufruf einer anderen Funktion nicht brauchst.

Quake 2. Sep 2007 20:15

Re: Verdrehte Bits (Wilde Pointereien)
 
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.


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. 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.

Apollonius 2. Sep 2007 20:19

Re: Verdrehte Bits (Wilde Pointereien)
 
Was soll denn das Rumgezeigere? Was spricht gegen
Delphi-Quellcode:
asm
mov eax, zahl
bswap eax
mov zahl, eax
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.
Seite 3 von 5     123 45      

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