Seite 1 von 1

[ASM] EXE datei erstellen | DLL`s benutzen

Verfasst: 02.11.2005 11:08
von IcedCoffee
Moin

ich habe jetzt mal wieder etwas mit ASM angefangen und wollte mal fragen wie ich mit dem ASM compiller eine EXE erstellen kan weil nasm macht bei mir immer nur BAT dateien

und wie kann ich mit ASM eine DLL öffnen und eine funktion aufrufen und parameter übergeben?

Verfasst: 02.11.2005 12:10
von hardfalcon
NASM macht sicher nicht nur BAT-Dateien bei dir. Wohl eher COM-Dateien. Und die dürfen nur maximal 64kb groß sein. Wenn du mehr haben willst, dann musst du deine EXEs im sogenannten PE-Format schreiben. Allerdings hab ich davon leider keine Ahnung, und Danilo ist ja leider nicht mehr hier, der hatte Ahnung vom PE-Format. Aber es gibt sicher auch noch andere User hier, die Ahnung von ASM und PE haben (traumatic?)...

//EDIT: Hast übrigens im falschen Forum gepostet, der Thread hier gehört eigentlich ins "Andere Sprachen"-Forum. Es geht ja hier um ASM, nicht um PB... :wink:

Verfasst: 02.11.2005 13:57
von Laurin
Da findet man alles, was das Herz begehrt ;)

-> http://www.robsite.de/tutorials.php?tut=assembly

Verfasst: 02.11.2005 14:09
von DarkDragon
hardfalcon hat geschrieben:Aber es gibt sicher auch noch andere User hier, die Ahnung von ASM und PE haben (traumatic?)...
traumatic doch nicht, außerdem ist er auch gegangen(ins englische forum, für immer).

Verfasst: 02.11.2005 18:14
von Eric
Erstmal brauchst du einen Assembler und einen Linker wie nasm & alink oder fasm & polink.

Du hast drei Möglichkeiten um eine DLL-Funktion zu verwenden.

1. Du schreibst extern bei fasm oder extrn bei nasm und dahinter den
Funktionsnamen. Allerdings brauchst du noch die dazugehörige Lib-Datei
für die DLL, die du hinterher noch mit verlinken musst.

2. Bei nasm kannst du auch etwas wie

Code: Alles auswählen

extrn sonstewas
import sonstewas wasweißich.dll
schreiben.

Dadurch brauchst du keine Lib-Datei, aber die exe-Datei wird etwas
größer. (ohne import sind es bei mir z.B. 1,5KB mit import 2,5KB :shock:)

3. Du kannst die DLL mit LoadLibraryA bzw LoadLibraryW laden und mit
GetProcAddress die Adresse ermitteln und die Funktion aufrufen.


Aufrufen ist eigendlich ganz einfach:
Die Parameter werden von links nach rechts auf den Stack gepusht und
die Funktion wird mit call aufgerufen. Der Rückgabewert befindet sich in
EAX.

Aber:
Funktionen über import werden mit call [funktionsname] aufgerufen, die
anderen ohne die eckigen Klammern.

Bei fasm setzen sich die Funktionsnamen etwas anders zusammen:
_funktionsname@Anzahl der Bytes, die als Parameter übergeben werden.

Bei manchen Assemblern kann man Funktionen auch mit invoke
Funktionsname,Parameter... aufrufen.

Es gibt auch eine Win32.inc für nasm und so etwas ähnliches fur fasm, wo
die ganzen Konstanten definiert sind (Falls ich die noch finde, kann ich sie
dir auch geben)

und hier noch zwei Beispiele für nasm/fasm:

fasm:

Code: Alles auswählen

format MS COFF

extrn _ExitProcess@4
extrn _MessageBoxA@16
public _WinMain@16

section '.text' code readable executable

_WinMain@16:

push dword 0
push hello
push hello
push dword 0
call _MessageBoxA@16

push dword 0
call _ExitProcess@4

section '.data' data readable writeable
hello db "Hello World",0
polink /entry:WinMain /nodefaultlib /subsystem:windows hello kernel32.lib user32.lib

nasm:

Code: Alles auswählen

EXTERN MessageBoxA
IMPORT MessageBoxA user32.dll
EXTERN ExitProcess
IMPORT ExitProcess kernel32.dll

segment .code USE32
..start

push dword 0
push hello
push hello
push dword 0
call [MessageBoxA]

push dword 0
call [ExitProcess]

segment .data
hello db "Hello World",0
Linken war glaub ich, mit:
alink hello -c -oPE -subsys windows

So, damit dürften alle Klarheiten beseitigt sein und ich hoffe mal, dass ich
nichts vergessen hab, sonst gibt es im Internet noch einige Informationen:
http://www.deinmeister.de/wasmtut.htm
http://www.robsite.de/download.php?id=9 ... =tassembly