![]() |
Parameterübergabe an Assemblerfuktionen?
Hallo,
ich weiß, das eine Assemblerfunktion ihre Parameter in folgender Weise übernimmt: Von links nach rechts 1. Parameter in EAX 2. Parameter in EDX 3. Parameter in ECX Alle weiteren Variablen kommen auf den Stack. So weit so gut. Das mag stimmen wenn die Länge der Parameter auch 32 Bit ist:
Delphi-Quellcode:
Ist das aber auch so, wenn diese Parameter a und b nur 16 Bit groß sind oder gar nur Bytes?
function myasmfunc(a: longint, b: longint): Longint; assemler;
Beim Rückgabewert einer Funktion tritt das gleiche Problem auf. Aber dort wäre, wenn das Funktionsergebnis in EAX zurückgegeben wird EAX halt bei kleineren Datenfeldern nur zum Teil fefüllt. Aber kann ich wirklich sicher sein, das auch Bytes und 16 Bit Integers konsequent in den 3 Registern zurückgegeben werden, im Zewifelsfall eben nur zum Teil gefüllt? |
AW: Parameterübergabe an Assemblerfuktionen?
lässt sich mit einem einfachen Programm leicht überprüfen.
Delphi-Quellcode:
CPU-Ansicht:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function Test(B: Byte; W: Word; I: Integer): LongInt; begin Result := B + W + I; end; begin try writeln(Test(5, 50000, 1000000)); { TODO -oUser -cConsole Main : Code hier einfügen } except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Code:
Project1.dpr.17: writeln(Test(5, 50000, 1000000));
0041C4B0 B940420F00 mov ecx,$000f4240 0041C4B5 66BA50C3 mov dx,$c350 0041C4B9 B005 mov al,$05 0041C4BB E814D5FFFF call Test |
AW: Parameterübergabe an Assemblerfuktionen?
Danke @BerndS.
Dann brauch ich mir diesbezüglich keine Sorgen zu machen. :) |
AW: Parameterübergabe an Assemblerfuktionen?
Sorgen machen musst Du dir nur, wenn Du ein 64bit-Kompilat ersteellen willst. Da ist die Reihenfolge der Parameter nämlich eine andere ...
|
AW: Parameterübergabe an Assemblerfuktionen?
Zitat:
Damit werd ich mich später beschäftigen. Jetzt erst mal 32Bit. |
AW: Parameterübergabe an Assemblerfuktionen?
Nur aus reiner Neugier...
Was gibt es heute noch, dass man in ASM programmieren "muss"... |
AW: Parameterübergabe an Assemblerfuktionen?
Zitat:
Ansonsten kann je nach Situation SSE hilfreich sein, was der Compiler nicht automatisch hinbekommt. |
AW: Parameterübergabe an Assemblerfuktionen?
Zitat:
Natürlich sollte man aufpassen, keine "premature optimization" durchzuführen. Aber wenn man eine rechenintensive Anwendung hat, kann es sich lohnen, mit einem Profiler nach den Engstellen zu suchen und diese in Assembly zu schreiben (mit SSE und allem Pipapo). ![]() Außerdem geht manches in Assembly schlicht einfacher. Konvertierung zwischen Big- und Little-Endian zum Beispiel. Für 16 Bit Werte gibt's in Delphi immerhin noch die intrinsische Funktion " ![]() ![]() |
AW: Parameterübergabe an Assemblerfuktionen?
Das ist etwas was mit dem GCC super funktioniert. Ge-inlinte Funtionen mit eingebettetem Assembler, wobei man Angaben zu Eingabe- und Ausgabe-Registern machen kann, sogar ohne sich auf spezifische Register festzulegen :thumb:
Dank der besser spezifizierten AMD64/x64-ABI sollte es in Zukunft nur einfacher werden, Aufrufe zu implementieren. Zitat:
Die beiden Hüte kann sich natürlich auch ein und die selbe Person aufhaben. |
AW: Parameterübergabe an Assemblerfuktionen?
Zitat:
Ich beschäftige mich gerade mit Ati Grain Gerometry ![]() Graeme Geldenhuys, der Macher des fpGUI Prokektes hat zur fpGUI die Pascal Version dieser Bibliothek dazu gepackt. Und bei einem Demo bin ich von der Darstellungsgeschewindigkeit regelrecht enttäuscht. Da könnte sich Assembelerprogrammierung noch lohnen. Ansonsten Neugier, sehen wie die CPU unsere Programme verarbeitet. Und natürlich die Compilerhersteller müssen wissen, welcher Code für das Hochsprachenkonstrukt erzeugt werden muss. Auch heute noch, es gibt ständig Compilererweiterungen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz