Hi!
Ich habe eine kleine
DLL geschrieben mit diversen Rechenoperationen.
Diese werden dann vom eigentlichen Programm aufgerufen, was über Assembler erfolgt. Die Übergabe der Parameter und der Aufruf der Funktion klappt soweit über Assembler, jedoch hab ich bei Fileßkommazahlen Probleme den Rückgabewert zu ermitteln.
Wenn ich als Rückgabewert Integer habe, so finde ich das Ergebnis im EAX-Register, bzw. bei Int64 noch zusätzlich im EDX, soweit kein Problem.
Bei Single und Double bekomme ich allerdings absurde Werte wie $16 oder $3 ins EAX-Register reingeschrieben, also fallen diese auch als Zeiger auf Fließkommawerte weg.
Delphi-Quellcode:
//Beispielfunktionen aus der DLL:
function add_2i64(a, b: Int64): Int64;
stdcall;
// Parameterübergabe klappt, Rückgabe klappt
begin
Result:=a+b;
end;
function add_2f(a, b: Single): Single;
stdcall;
// Parameterübergabe klappt, Rückgabe schlägt fehl
begin
Result:=a+b;
end;
//Aufruf der Funktion(Ausschnitt)
{
p, prc: Pointer;
x, n: Integer;
Rslt: array[0..1]of Cardinal;
Result --> Pointer
}
n:=Params.Count-1;
//Parameterübergabe
if(n>-1)
then
begin
x:=n;
repeat
p:=Params[x];
asm
PUSH p
end;
Dec(x);
until(x=-1);
end;
n:=Params.Count*4;
asm
CALL prc
//Aufruf der Funktion
ADD ESP, n
//Säubern des Stacks
MOV DWORD PTR [Rslt], EAX
//Kopieren des EAX-Registers
end;
Result:=@Rslt;
Weiß einer ne Lösung? ^^ Oder hat einer Verbesserungsvorschläge?