[ASM] EXE datei erstellen | DLL`s benutzen

Fragen zu allen anderen Programmiersprachen.
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

[ASM] EXE datei erstellen | DLL`s benutzen

Beitrag 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?
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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:
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Da findet man alles, was das Herz begehrt ;)

-> http://www.robsite.de/tutorials.php?tut=assembly
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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).
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.
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag 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
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Antworten