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

)
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