Einzelnen Beitrag anzeigen

MaOfDe

Registriert seit: 3. Jan 2004
Ort: Berlin
73 Beiträge
 
Delphi 6 Personal
 
#1

Fließkomma-Rückgabewert über Assembler

  Alt 19. Apr 2006, 01:27
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?
  Mit Zitat antworten Zitat