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