AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Parameterübergabe an Assemblerfuktionen?
Thema durchsuchen
Ansicht
Themen-Optionen

Parameterübergabe an Assemblerfuktionen?

Ein Thema von DualCoreCpu · begonnen am 28. Okt 2015 · letzter Beitrag vom 30. Okt 2015
Antwort Antwort
Seite 1 von 2  1 2      
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

Parameterübergabe an Assemblerfuktionen?

  Alt 28. Okt 2015, 11:40
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:

function myasmfunc(a: longint, b: longint): Longint; assemler; Ist das aber auch so, wenn diese Parameter a und b nur 16 Bit groß sind oder gar nur Bytes?

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?
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 28. Okt 2015, 11:50
lässt sich mit einem einfachen Programm leicht überprüfen.
Delphi-Quellcode:
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.
CPU-Ansicht:
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
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#3

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 28. Okt 2015, 13:31
Danke @BerndS.

Dann brauch ich mir diesbezüglich keine Sorgen zu machen.
  Mit Zitat antworten Zitat
Benutzerbild von TRomano
TRomano

Registriert seit: 24. Nov 2004
Ort: Düsseldorf
193 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 28. Okt 2015, 13:36
Sorgen machen musst Du dir nur, wenn Du ein 64bit-Kompilat ersteellen willst. Da ist die Reihenfolge der Parameter nämlich eine andere ...
Thomas Forget
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#5

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 28. Okt 2015, 14:46
Sorgen machen musst Du dir nur, wenn Du ein 64bit-Kompilat ersteellen willst. Da ist die Reihenfolge der Parameter nämlich eine andere ...
Ok, danke für den Hinweis.

Damit werd ich mich später beschäftigen. Jetzt erst mal 32Bit.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 29. Okt 2015, 13:30
Nur aus reiner Neugier...

Was gibt es heute noch, dass man in ASM programmieren "muss"...
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 29. Okt 2015, 13:33
Nur aus reiner Neugier...

Was gibt es heute noch, dass man in ASM programmieren "muss"...
Zumindest mal Teile von Bootloadern/Betriebssystemen
Ansonsten kann je nach Situation SSE hilfreich sein, was der Compiler nicht automatisch hinbekommt.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#8

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 29. Okt 2015, 14:52
Was gibt es heute noch, dass man in ASM programmieren "muss"...
Jede Menge, wenn man an Leistung interessiert ist. Der Delphi-Compiler optimiert leider nicht gut genug.
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).
FL Studio zum Beispiel benutzt Delphi und jede Menge Inline Assembly für Audiosignalverarbeitung.

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 "Swap". Für 32 Bit muss man sich selbst etwas basteln, aus shl/shr, and, or. In Intel Assembly gibt's dafür einen dedizierten Befehl: bswap. Ich warte schon seit Jahren, dass Delphi das auch mal als intrinsische Funktion zur Verfügung stellt (Swap32 oder so). Aber das wird wohl nichts mehr; und wenn ich in der Hilfe zu Swap (siehe oben) lese "Die Prozedur dient lediglich der Abwärtskompatibilität", kann ich nur den Kopf schütteln...

Geändert von SMO (29. Okt 2015 um 14:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#9

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 29. Okt 2015, 16:18
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
Dank der besser spezifizierten AMD64/x64-ABI sollte es in Zukunft nur einfacher werden, Aufrufe zu implementieren.


Natürlich sollte man aufpassen, keine "premature optimization" durchzuführen.
Für das Backend macht es imho Sinn, die Zielarchitektur zu kennen bevor man mit dem Design loslegt. Das Anforderungen des Problems sollte bekannt sein, die Fähigkeiten der Hardware sollten bekannt sein. Damit kann man dann von vornherein sinnvolle Abstraktionen festlegen, die man dann später auch Optimieren kann. Als Anwendungsprogrammierer bekommt man das in Form von Bibliotheken serviert und muss das dann sinnvoll einsetzten; das Wissen über die Zielplattform sollte an der Stelle schon wegabstrahiert sein.
Die beiden Hüte kann sich natürlich auch ein und die selbe Person aufhaben.

Geändert von BUG (29. Okt 2015 um 16:20 Uhr)
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#10

AW: Parameterübergabe an Assemblerfuktionen?

  Alt 29. Okt 2015, 17:22
Nur aus reiner Neugier...

Was gibt es heute noch, dass man in ASM programmieren "muss"...
Schnelle Grafikroutinen für PC Spiele. Mathematische Funktionen für lanwierige Berechnungen. Es sei denn letzere werden schon auf Operatorebene passend optimiert.

Ich beschäftige mich gerade mit Ati Grain Gerometry http://www.antigrain.com.

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz