![]() |
Assembler Files einbinden
Hallo,
ich suche eine Möglichkeit reinen Assembler Code in Delphi zu verwenden. Soll heißen: Ich habe mehrere reine Assembler Dateien, die verschiedene Routinen enthalten, die ich in Delphi nutzen möchte. Prinzipiell muss ich nur eine Möglichkeit haben die asm-files zu kompilieren (ggf. eben mit nasm) und dem Delphi-Linker mitzuteilen, dass ich ein paar externe Procedures und Functions habe. Dass das möglich ist zeigt Delphi selbst in der system.pas (zu finden unter "...\Borland\Delphi5\Source\Rtl\Sys\") wo verschiedene assembler funktionen als extern deklariert wurden. Wie genau muss ich da vorgehen? Ich bin ein C/C++ Mensch und verwende Delphi nur in der Not. Wäre wirklich super, wenn jemand die Lösung hätte. |
Re: Assembler Files einbinden
du kannst es direkt als "Inline-ASM" anlegen
das geht an jeder Stelle innerhalb des Pascalcodes oder auch als kompletter Prozedurrumpf.
Delphi-Quellcode:
wenn du reine ASM-Befehle im "Delphi-Stiel" einbinden willst
asm
mov eax, 0 end;
Delphi-Quellcode:
asm
{$INLINE myfile.asm} end; |
Re: Assembler Files einbinden
Zitat:
Dass die Möglichkeit besteht, zeigt - wie bereits erwähnt - die System.pas. Irgendwie muss das doch möglich sein, dem Linker mitzuteilen, dass da was existiert. Wenn ich die Funktion per extern kennzeichne und den Pfad zu einer aout datei setzte, dann kommt die Fehlermeldung, dass die datei keine "Windowsdatei" wäre ... |
Re: Assembler Files einbinden
Übersetzen mit TASM und in Delphi einbinden per Schlüsselwort "external" und dem Befehl die OBJ dazu zu linken "{$L file.obj}"
|
Re: Assembler Files einbinden
Schuss ins Blaue: *.asm in *.obj kompilieren und in einer Delphi-Unit {$L Funktionen.obj}. Sowas Ähnliches wird in ZLib.pas (in den VCL-Sourcen, zumindest bei mir (D2007)) gemacht.
@Roter Kasten: Ich hab ja noch den Verweis auf ZLib als Beispiel. :-) |
Re: Assembler Files einbinden
Zitat:
|
Re: Assembler Files einbinden
Der Delphi-Compiler kennt nur sein Pascal, das sogenannte "Inline"-ASM und den vorkompilierten Maschienencode aus OBJ-Dateien.
Wenn du ihm etwas Anderes mitgeben willst, dann mußt du dieses erstmal in ein Format bringen, welches der Delphi-Compiler kennt. Also, indem man z.B. Assembler via TASM oder MASM oder C über einen C-Compiler in das OBJ-Format umwandelt. |
Re: Assembler Files einbinden
Zitat:
|
Re: Assembler Files einbinden
Ich bekomms einfach nicht hin:
Hab mal ein Test-Szenario erstellt. Sieht folgendermaßen aus:
Delphi-Quellcode:
unit TestUnit;
interface function Summe(i1, i2 : Integer): Integer; implementation function Summe(i1, i2 : Integer): Integer; external; {$L sum.obj} end.
Code:
global _Summe
; function Summe(i1, i2: Integer): Integer ; _Summe: add eax, edx ret Ich habe "sum.obj" folgendermaßen kompiliert: nasmw -f obj -o sum.obj nasmw -f win32 -o sum.obj Ich bekomme die Meldung, dass sum.obj ein falsches Dateiformat wäre (win32) bzw. 16-Bit Segmente entdeckt wurden (obj) Was mache ich falsch? |
Re: Assembler Files einbinden
Wenn sum.asm Dein Beispiel wie folgt enthält
Code:
mit Tasm32 assemblieren: Tasm32 sum.asm und einbinden mit
.586
.model flat .code public sum sum proc add eax,edx ret sum endp end
Delphi-Quellcode:
Läuft ohne Probleme.
function sum(a,b: integer):integer; register; external; {$l sum.obj}
Ansonsten Aufrufkonventionen beachten/anpassen: stdcall, pascal, cdecl Stichwort Calling conventions in Onlinehilfe. |
Re: Assembler Files einbinden
Zitat:
Mein Problem ist, dass er mein object-file anmeckert, weil es angeblich 16 Bit Segmente enthält. |
Re: Assembler Files einbinden
Das ist dann aber hauptsächlich ein NASM-Problem; vielleicht gibt's da ja ein Forum, wo Du nachfragen kannst.
|
Re: Assembler Files einbinden
Du solltest auch darauf achten, daß es durchaus unterschiedliche Object Dateiformate gibt. Die zwei gängigsten Formate sind OMF und COFF. Delphi versteht dabei nur OMF. Die meisten anderen Entwicklungstools wie z.B. Visual Studio benutzen das COFF Format. Da die von NASM erzeugten Objektdateien in Visual Studio nutzbar sind, würde ich vermuten, daß es COFF Dateien erzeugt. Ob NASM evtl. auch OMF Dateien erzeugen kann, kann ich nicht sagen (aber ein Blick in die Hilfe sollte helfen). Ansonsten solltest Du einen Assembler verwenden, der OMF Dateien erstellen kann, wie z.B. der bereits genannte TASM32.
|
Re: Assembler Files einbinden
Okay, mit MASM kompiliert und schon geht's. Irgendwie kann NASM(W) keine 32-Bit OMF-OBJ Dateien erzeugen ... okay, dann danke an alle.
|
Re: Assembler Files einbinden
Zitat:
|
Re: Assembler Files einbinden
Ich kenn NASM nicht. Benutze persönlich MASM oder TASM32. War nur eine Vermutung meinerseits.
|
Re: Assembler Files einbinden
Da Du bei nasm/obj eine "16-Bit Segment"-Fehlermeldung erhälst, fehlt vielleicht eine 32-Bit directive, zB etwas wie section .text use32 (aus einem alten aes.asm, habe keine Ahnung von nasm).
Gruß Gammatester |
Re: Assembler Files einbinden
versuche mal bei NASM
Delphi-Quellcode:
[BITS 32]
; Code... |
Re: Assembler Files einbinden
Zitat:
Dummerweiße zwingt mich dass jetzt dazu MASM zu benutzen und ich stoße dabei auf einige Probleme. Ich habe folgenden Code:
Code:
TITLE SimpleTest.asm
.686P .XMM .MODEL FLAT PUBLIC Proc1 PUBLIC Proc2 .CODE Proc1 PROC ; ; Proc1 ENDP Proc2 PROC ; ; Proc2 ENDP END In Delphi sind Proc1 und Proc2 mt 'external' deklariert und linken das entsprechende Obj-File. So lange ich nur Proc1 (oder Proc2) kompiliere und in Delphi einbinde, habe ich keine Probleme. Wenn ich aber zwei Routinen (also Proc1 und Proc2) kompiliere und dann entsprechend in Delphi deklariere, bekomme ich die Fehlermeldungen:
Code:
Falsche globale Symboldefinition in [...] (Objfile)
Ungenügende external Deklaration Proc1 Was genau hat sich dadurch geändert, dass ich noch eine zweite Funktion in meinem Code habe? Also MASM wirft da keine Fehler, aber Delphi mag es nicht mehr. Kompiliert habe ich es mit /omf. |
Re: Assembler Files einbinden
Dazu sollte man noch sagen, dass der selbige Code (mit angepasster Parameterabfrage) sich ohne Probleme in C (VC 9) verwenden lässt.
|
Re: Assembler Files einbinden
Falls es hilft: Keine Probleme mit TASM 5.0.
|
Re: Assembler Files einbinden
Hier eine Version mit MASM, die ohne Probleme von D6 akzeptiert wird.
Code:
TITLE SimpleTest.asm
.686P .XMM .MODEL FLAT PUBLIC Proc1 PUBLIC Proc2 .CODE proc1_text Proc1 PROC ; ; Proc1 ENDP .CODE proc2_text Proc2 PROC ; ; Proc2 ENDP END |
Re: Assembler Files einbinden
Zitat:
Code:
TITLE Test.asm
.686P .XMM .MODEL FLAT PUBLIC Proc1 PUBLIC Proc2 .CODE Proc1 PROC ret Proc1 ENDP Proc2 PROC ret Proc2 ENDP END
Delphi-Quellcode:
Unit Test;
interface procedure Proc1(); procedure Proc2(); implementation {$LINK Test.obj} procedure Proc1(); external; procedure Proc2(); external; end. Wenn ich Proc2 in Delphi auskommentiere, dann geht es. Lasse ich es drin:
Code:
Ungenügende Forward- oder External-Deklaration 'Proc2'
Und in C mit dem VS geht das wunderbar. Versteh ich absolut nicht, was da die Ursache ist. Zitat:
|
Re: Assembler Files einbinden
Meine letzte Version mit .CODE proc2_text ist auch mit Delphi5 kompilierbar. Daß es D5 bei Dir nicht packt, liegt dann wohl daran, daß Du nicht das letzte asm benutzt oder geht's damit auch nicht?
|
Re: Assembler Files einbinden
Zitat:
Ich benutze den Code, der in meinem letzten Posting steht. Wie hast du es denn in Delphi deklariert? |
Re: Assembler Files einbinden
Zitat:
Delphi-Quellcode:
procedure proc1; external;
procedure proc2; external; {$link xx.obj} |
Re: Assembler Files einbinden
mmmh,
also ich hab's jetzt mit /omf zusätzlich kompilieren müssen, da MASM standardmäßig coff-files erzeugt (wenn ich mich nicht irre). Und was soll ich sagen; es geht! Der einzige Unterschied ist, dass du mehrere Code-Segmente (also zwei) gemacht hast. Aber warum ist dass notwendig? Ich muss wirklich sagen, dass die Verbindung masm / Delphi durchaus komplizierter ist als c / nasm. Da hat man so Probleme nicht. Kannst du evtl. mal 1-2 Sätze dazu sagen, warum dass hier notwendig ist? |
Re: Assembler Files einbinden
Zitat:
Zitat:
Zitat:
Gruß Gammatester |
Re: Assembler Files einbinden
Zitat:
Kann mir jedenfalls nicht vorstellen, dass man für jede Funktion ein neues Code-Segment bedingen muss ... ist eigentlich ziemlich absurd aus meiner Sicht. |
Re: Assembler Files einbinden
Ob man's glauben mag oder nicht:
Der Fehler ist jetzt schon wieder aufgetreten. Delphi sagt als Warnung immer: 'Falsche globale Symboldefinition' bei beiden Funktionen. Dass führt in meinem Entwicklungsprojekt jetzt zu einer Zugriffsverletzung in der dcc50.dll. Was ist falsch am Code?
Code:
TITLE Test.asm
.686P .XMM .MODEL FLAT PUBLIC FuncA PUBLIC FuncB .CODE FuncA_Code FuncA PROC FuncA ENDP .CODE FuncB_Code FuncBPROC FuncBENDP END |
Re: Assembler Files einbinden
So kann das eigentlich gar nicht assembliert werden. In
Code:
fehlen Leerzeichen. Selbst wenn die drin sind, müssen auf jeden Fahll rets rein (sonst rennt die CPU ins Nirvana). Bei mir läuft dieser Code (assembliert mit ml /c test.asm) ohne Probleme in Delphi5 und Delhi6:
FuncBPROC
FuncBENDP
Code:
Deklariert in Delphi als
TITLE Test.asm
.686P .XMM .MODEL FLAT PUBLIC FuncA PUBLIC FuncB .CODE FuncA_Code FuncA PROC ret FuncA ENDP .CODE FuncB_Code FuncB PROC ret FuncB ENDP END
Delphi-Quellcode:
procedure funca; external;
procedure funcb; external; {$l test.obj} |
Re: Assembler Files einbinden
Zitat:
Der Compiler hätte sonst schon gemeckert. Das Problem ist derweil aber gelöst: Und zwar hatte ich dem Delphi-Linker mitgeteilt, dass er bitte C-Objekt-Dateien erzeugen soll. Offensichtlich ist dieses Feature eher unausgereift. |
Re: Assembler Files einbinden
Verstehe nicht ganz was Du machen willst: Der Delphi-Linker soll aus dem ASM/Obj-Files dann C-Obj-Files machen?? (Normalerweiser macht ein Linker keine Obj-Files.)
Wie auch immer: wenn's C bzw. Borland C++ sein soll, muß man wohl die besondere Namenskonventionen von C beachten bzw das Reinmangeln von Parametertypen etc. Dabei kann nun wirklich nicht weiterhelfen; weiß nur, daß es das gibt. |
Re: Assembler Files einbinden
Zitat:
Der Fehler lag überhaupt nicht bei meinem Assembler-Code bzw. Object-File, sondern an einer ganz anderen Kannte. Ich hatte als Linker-Ausgabe (in Delphi) C-Objektdateien gewählt. Aus irgendeinem Grund scheint dieses Feature aber nicht 100% ausgereift zu seien, da es bei meinem Code Probleme bei der Erzeugung dieser C-Objectdateien gab. Dies wiederum gab die Fehlermeldung aber in keinster Art und Weiße her, weshalb ich den Fehler in meinem ASM-Code vermutete. |
Re: Assembler Files einbinden
Delphi treibt mich in den Wahnsinn, daher muss ich diesen Thread noch mal ausgraben.
Habe ein Objekt-File, dass ich mit MASM folgendermaßen kompiliert habe: ml /c /omf "source.asm" Das ganze habe ich dann per "{$LINK "Pfad\source.obj"} in Delphi gelinkt und bekomme aber immer die Meldung: "Falsches Dateiformat". Warum? |
Re: Assembler Files einbinden
Zitat:
|
Re: Assembler Files einbinden
Zitat:
/omf, siehe ![]() btw. habe ich in der Vergangenheit ja schon erfolgreich mit MASM32 kompilierte OMF-Objektdateien in Delphi eingebunden. Fragt sich nur, was ich damals anders gemacht habe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 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-2025 by Thomas Breitkreuz