Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Assembler Files einbinden (https://www.delphipraxis.net/144506-assembler-files-einbinden.html)

FrEEzE2046 9. Dez 2009 10:23


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.

himitsu 9. Dez 2009 11:08

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:
asm
  mov eax, 0
end;
wenn du reine ASM-Befehle im "Delphi-Stiel" einbinden willst
Delphi-Quellcode:
asm
  {$INLINE myfile.asm}
end;

FrEEzE2046 9. Dez 2009 11:49

Re: Assembler Files einbinden
 
Zitat:

Zitat von himitsu
du kannst es direkt als "Inline-ASM" anlegen

Danke für deine Hilfe. Ich habe aber extra "reines asm" geschrieben, da ich den Inline-Assembler eben NICHT benutzen will.
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 ...

Muetze1 9. Dez 2009 12:11

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}"

uligerhardt 9. Dez 2009 12:15

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. :-)

gammatester 9. Dez 2009 12:18

Re: Assembler Files einbinden
 
Zitat:

Zitat von FrEEzE2046
Danke für deine Hilfe. Ich habe aber extra "reines asm" geschrieben, da ich den Inline-Assembler eben NICHT benutzen will.
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 ...

Das ist Unsinn: System.pas bindet kein reines asm ein. Was gemacht wird - und schon seit dem letzen Jahrtausend unterstützt wird-, ist das Einbinden von Obj-Files. Wo die herkommen ist im Prinzip egal, Du kannst zB ASM-Files mit TASM oder MASM übersetzen.

himitsu 9. Dez 2009 12:32

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.

FrEEzE2046 9. Dez 2009 13:02

Re: Assembler Files einbinden
 
Zitat:

Zitat von gammatester
Das ist Unsinn: System.pas bindet kein reines asm ein. Was gemacht wird - und schon seit dem letzen Jahrtausend unterstützt wird-, ist das Einbinden von Obj-Files. Wo die herkommen ist im Prinzip egal, Du kannst zB ASM-Files mit TASM oder MASM übersetzen.

Ich wollte auch nicht sagen, dass der Delphi-Compiler Assembler kompilieren kann. Die Antwort, eine Obj.-Datei per extern einzubinden, war die die ich wollte. Ich meinte eigentlich auch lediglich, dass System.pas auch externe (ursprünglich in assembler geschriebene) Routinen einbindet.

FrEEzE2046 9. Dez 2009 13:12

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?

gammatester 9. Dez 2009 13:46

Re: Assembler Files einbinden
 
Wenn sum.asm Dein Beispiel wie folgt enthält
Code:
.586
.model flat
.code
public sum
sum proc
    add eax,edx
    ret
sum endp
    end
mit Tasm32 assemblieren: Tasm32 sum.asm und einbinden mit
Delphi-Quellcode:
function sum(a,b: integer):integer; register; external; {$l sum.obj}
Läuft ohne Probleme.

Ansonsten Aufrufkonventionen beachten/anpassen: stdcall, pascal, cdecl Stichwort Calling conventions in Onlinehilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

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