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?
[ASM] EXE datei erstellen | DLL`s benutzen
-
- Beiträge: 115
- Registriert: 09.07.2005 12:11
- Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
- Kontaktdaten:
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
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...
//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...

-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
traumatic doch nicht, außerdem ist er auch gegangen(ins englische forum, für immer).hardfalcon hat geschrieben:Aber es gibt sicher auch noch andere User hier, die Ahnung von ASM und PE haben (traumatic?)...
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
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:
polink /entry:WinMain /nodefaultlib /subsystem:windows hello kernel32.lib user32.lib
nasm:
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
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
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
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
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