Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

[inline-asm] Ich komm mit den Parametern net klar...

  Alt 9. Apr 2004, 22:24
Hi Osterhasis!

Ich spiele wieder ein wenig mit dem Inline-Assembler herum, und hab mir dazu auch mal die D7-Sprachreferenz + Handbuch vor die Nase gelegt. Aber die gehen ja leider leider kaum auf den Assembler ein

Folgende Methoden funktionieren wie gewünscht:
Delphi-Quellcode:
type
  TQuat = record
    x,y,z,w: double;
  end;
.
.
.
function addQ(const a, b: TQuat): TQuat;
asm
  FLD QWORD PTR [EBP-32]; // a.x to stack
  FLD QWORD PTR [EBP-24]; // a.y to stack
  FLD QWORD PTR [EBP-16]; // a.z to stack
  FLD QWORD PTR [EBP- 8]; // a.w to stack

  FADD QWORD PTR [EBP-40]; // result.w := a.w + b.w
  FSTP QWORD PTR [ECX+24];
  FADD QWORD PTR [EBP-48]; // result.z := a.z + b.z
  FSTP QWORD PTR [ECX+16];
  FADD QWORD PTR [EBP-56]; // result.y := a.y + b.y
  FSTP QWORD PTR [ECX+ 8];
  FADD QWORD PTR [EBP-64]; // result.x := a.x + b.x
  FSTP QWORD PTR [ECX ];
end;

function mulQ(const a, b: TQuat): TQuat;
asm
  FLD QWORD PTR [EBP-32]; // a.x to stack
  FLD QWORD PTR [EBP-24]; // a.y to stack
  FLD QWORD PTR [EBP-16]; // a.z to stack
  FLD QWORD PTR [EBP- 8]; // a.w to stack

  FMUL QWORD PTR [EBP-40]; // result.w := a.w * b.w
  FSTP QWORD PTR [ECX+24];
  FMUL QWORD PTR [EBP-48]; // result.z := a.z * b.z
  FSTP QWORD PTR [ECX+16];
  FMUL QWORD PTR [EBP-56]; // result.y := a.y * b.y
  FSTP QWORD PTR [ECX+ 8];
  FMUL QWORD PTR [EBP-64]; // result.x := a.x * b.x
  FSTP QWORD PTR [ECX ];
end;
Das ist ja schonmal ein Anfang! (Geht's nebenbei noch eleganter/schneller??)
Aaaber, nun hab ich eine Prozedur, die nur einen Parameter bekommt, und schon klappt es nicht mehr. Die Prozedur:
Delphi-Quellcode:
function sqrQ(const a: TQuat): TQuat;
asm
  FLD QWORD PTR [EBP-32];
  FLD QWORD PTR [EBP-24];
  FLD QWORD PTR [EBP-16];
  FLD QWORD PTR [EBP- 8];

  FMUL QWORD PTR [EBP- 8];
  FSTP QWORD PTR [ECX+24]; // *
  FMUL QWORD PTR [EBP-16];
  FSTP QWORD PTR [ECX+16];
  FMUL QWORD PTR [EBP-24];
  FSTP QWORD PTR [ECX+ 8];
  FMUL QWORD PTR [EBP-32];
  FSTP QWORD PTR [ECX ];
end;
Ich hab sie genau so aufgebaut wie die anderen beiden, aber folgende Fehlermeldung zur Runtime:
[...] Accessviolation [...] Schreiben von Adresse 00000018
An der mit nem * markierten Zeile wird gehalten.

Was kann/muss ich anders machen? Ich verstehe die Übergabe von nicht-ordinalen Typen an ein function-result nicht so wirklich...


Großes Osterdanke schonmal!
dizzy


\\edit: Nachtrag: Wäre es evtl. sinnvoll hierfür MMX einzusetzen? (Es geht geschwindigkeitstechnisch um die Wurst ) Wie würde man das dann implementieren müssen?
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat