AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Verdrehte Bits (Wilde Pointereien)

Ein Thema von Phoenix · begonnen am 16. Aug 2007 · letzter Beitrag vom 4. Sep 2007
Antwort Antwort
Seite 3 von 5     123 45   
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 14:48
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#22

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 15:13
Moin Quake,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 15:24
Ups Du hast natürlich Recht. Habe ich oben mal schnell geändert .

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;
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#24

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 16:00
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.
  Mit Zitat antworten Zitat
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

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

n/a Beiträge
 
#26

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 16:44
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;
  Mit Zitat antworten Zitat
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

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

n/a Beiträge
 
#28

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 17:23
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.
  Mit Zitat antworten Zitat
Quake

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 20:15
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.
  Mit Zitat antworten Zitat
Apollonius

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

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 2. Sep 2007, 20:19
Was soll denn das Rumgezeigere? Was spricht gegen
Delphi-Quellcode:
asm
mov eax, zahl
bswap eax
mov zahl, eax
end;
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:37 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