[HowTo] nasm + alink verwenden

09/19/2011 07:03 Tyrar#1
so, hier gehts darum wie ihr mit nasm und alink euren code assemblieren + linken könnt! (windoof)

was benötigt wird: nasm, alink, win32.lib, win32n.inc... gibts alles [Only registered and activated users can see links. Click Here To Register...]!

gehen wir einfach mal von einer simplen anwendung aus die ne messagebox anzeigen soll und den process mit terminateprocess beendet.

als erstes sollte man die externen symbole definieren ;)
Code:
extern MessageBoxA
extern GetCurrentProcess
extern TerminateProcess
durch die win32.lib ist das auch genau so richtig!

zunächst wäre der entrypoint wichtig, der muss global definiert sein:
Code:
global start
und der code
Code:
start:
push 0
push szTitle
push szMessage
push 0
call MessageBoxA
add esp, 0x0C
call GetCurrentProcess
push 0
push eax
call TerminateProcess
add esp, 0x08
da das so nicht reichen würde, hier nochmal die .data section:
Code:
szTitle db 'MessageBox',0
szMessage db 'asm rox!',0
jetz gehts zu dem eigentlichen part was ich hier posten wollte :D

sinnvoll wäre es das ganze mit nasm zu assemblieren:
Code:
nasm -fwin32 messagebox.asm -o messagebox.obj
das -fwin32 ist das output format, in dem fall win32 object files!
das -o messagebox.obj ist die output datei.
messagebox.asm ist dann die input datei!

um das ganze zu linken:
Code:
alink -oPE -o messagebox.exe -entry start -subsys console messagebox.obj WIN32.LIB
-oPE ist hier das output format
-o messagebox.exe ist die output datei!
-entry start gibt den entrypoint an (hier start)
-subsys console sorg dafür dass zum starten die console angezeigt wird
die letzten parameter sind die inputdateien die zusammengelinkt werden (WIN32.LIB für die imports)

um eine dll zu erstellen muss noch der parameter -dll angehängt werden (-subsys console is dann unnötig)

alle weiteren parameter bekommt man mit der option -h

ich sollte noch anmerken dass es sinnvoller ist den prozess "anders" zu beenden ;)

warum man grade asm verwenden sollte? kleines beispiel: mein c++ code hatte ~700kb, in asm hat der gleiche code nurnoch 4kb ;) es fallen also die (in meinem fall) unnötigen funktionen der crt weg!
09/19/2011 20:21 Akorn#2
Soweit ich weis stammt die letzte version von Alink noch aus dem vergangenen Jahrtausend. Ich benutze immer GoLink das ist auch beim Nasmx projekt dabei. Mit dem kannste auch einfach resource datein mitlinken und man braucht auch keine .lib datein.
09/20/2011 03:26 link#3
GetCurrentProcess schreibt einfach nur den Wert -1 in eax. Könntest eigentlich direkt push -1 schreiben. Statt TerminateProcess könntest du auch einfach ExitProcess verwenden.
Ich versteh nicht so ganz, wofür die Stack Anpassungen sind, ist doch alles stdcall..
Ich weiß ja nicht, wie dein C++ Output aussah, aber man kann die CRT auch dynamisch linken, also einfach via msvcrt.dll importieren und wenn man beim MS Linker den Entrypoint ändert, hat man auch keinen Startup-Code :P

Btw. mit dem Same-Source-Same-Output-Assembler FASM würde das ganze so funktionieren:

1. FASM Package für Windows herunterladen
2. Archiv entpacken und FASMW starten
3. Code in FASMW hinein kopieren und F9 drücken, fertig.

Code:
format PE GUI 4.0
entry start

include 'win32ax.inc'

section '.text' code readable executable

  start:
        push    MB_OK
        push    szTitle
        push    szMessage
        push    0
        call    [MessageBox]
        push    0
        call    [ExitProcess]

        ;oder alternativ mit FASM's Makros:

        invoke  MessageBox,0,'asm rox!','MessageBox',MB_OK
        invoke  ExitProcess,0

section '.data' data readable writeable

  szTitle db 'MessageBox',0
  szMessage db 'asm rox!',0

section '.imps' import data readable

  library kernel32,'kernel32.dll',\
           user32,'user32.dll'

  import kernel32,\
           ExitProcess,'ExitProcess'

  import user32,\
           MessageBox,'MessageBoxA'

  ;statt des import-Makros könnte man auch einfach
  ;include 'api\kernel32.inc'
  ;schreiben, dann würden die in kernel32.inc enthaltenen Funktionen
  ;in die Importstable kommen, zu denen es eine Referenz gibt
Und da FASM die Imports direkt in den PE Header schreibt, braucht man auch keine Import-Libs.

Alle Switches, die bestimmen, wie der Output aussehen soll, kommen in den Source,
ohne lästige Commandline bzw. makeit.bat :P

Da FASM ein Assembler und kein Linker ist, kann man damit keine objs oder libs zu einem Output zusammenlinken, man könnte allerdings via format MS COFF obj-Dateien erstellen und z.B. auch ALink verwenden.
OMF wird leider nicht unterstützt, gibt dafür aber Tools.

PS: Ich fühl mich hier gerade wie Kanye West bei den MTV Video Music Awards :D
08/02/2012 16:35 weuof9jiwf#4
Der Link aus dem ersten Post mit nasm, alink, win32.lib, win32n.inc ist down

kann das mal bitte jemand hochladen?