![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 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