Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 01:00

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[HowTo] nasm + alink verwenden

Discussion on [HowTo] nasm + alink verwenden within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
[HowTo] nasm + alink verwenden

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 !

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

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!
Tyrar is offline  
Thanks
2 Users
Old 09/19/2011, 20:21   #2
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
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.
Akorn is offline  
Old 09/20/2011, 03:26   #3
 
link's Avatar
 
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
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
link is offline  
Old 08/02/2012, 16:35   #4
 
elite*gold: 0
Join Date: Aug 2012
Posts: 4
Received Thanks: 1
Der Link aus dem ersten Post mit nasm, alink, win32.lib, win32n.inc ist down

kann das mal bitte jemand hochladen?
weuof9jiwf is offline  
Reply


Similar Threads Similar Threads
Ce ins s4 verwenden
12/08/2010 - S4 League - 2 Replies
wie kann ich ce in s4 patch 24.0 benutzen?tut und programme
[HowTo]LC Loader wieder verwenden
09/04/2010 - Last Chaos - 0 Replies
Hi, ich werde euch sagen wie man den lc loader wieder auf LC US verwenden kann zuerst braucht an den loader mit der EnginesUI.dll datei in seinem bin ordner danach patcht man LastChaos USa auf deutsch mit dem translator von jana jetzt einfach loader starten lastchaos de häcken machen und start lastchaos drücken dann kommt das der patch felgeschlagen ist aber siehe da LC öffnet sich! LG
[HowTo] Item_proto verwenden
08/31/2010 - Metin2 PServer Guides & Strategies - 12 Replies
Vorab, weiss nicht obs das schon gibt, hab die SuFu benutzt aber nichts gefunden :awesome: Auch wenns einige schon wissen, dann hilfts wenigstens den Anfängern. Wer nicht weiss, was in die einzelnen Spalten rein kommt, bekommt hier Abhilfe. Die ersten Spalten sind unwichtig, die lasst ihr einfach so. size: Einige haben evtl. gemerkt, dass der Dämonenfächer 2 Plätze im Inventar verwendet, obwohl Fächer nur 1 Platz brauchen. Liegt daran, dass bei dem Fächer in der Item_Proto in "size"...
[HowTo]Monster als Laden verwenden
05/08/2010 - Metin2 PServer Guides & Strategies - 18 Replies
Hey, so erstmal ist mein erstes also bitte 1. nicht so streng sein und 2. bitte nicht übel nehmen, wenn es diesen Thread schon gibt, weil ich hab auf Anhieb nichts gefunden. Und ich hoffe der TuT gefällt euch. =) Ich nehme in meinem Bsp. mal den Bär. Als erstes connectet ihr zu eurer DB geht in . >player. >mob proto.



All times are GMT +1. The time now is 01:01.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.