Nasm/alink problem
-
Hi, ich wollte gerade zum ersten mal mit assembler rumspielen nur leider ging das schon kläglich in die hoose

zuerstmal hab ich mir nasm runter geladen (http://sourceforge.net/project/showfiles.php?group_id=6208&package_id=47034&release_id=606132 ist das das richtige packet?)
als programm hab ich mir einfach was simples von google gesucht
section .data msg db 'Hello, world!',0xA len equ $-msg section .text global _start _start: mov edx,len mov ecx,msg mov ebx,1 mov eax,4 int 0x80 mov ebx,0 mov eax,1 int 0x80aufrufen tu ich beides mit:
nasm.exe -f obj hallo.asm alink.exe hallo.obj -oEXE -entry _startsoweit laufen die beiden sachen auch durch, nur das alink meckert das es keinen stack gebe, mit
SEGMENT stack stack ; These 3 lines are added because alink resb 64 ; complains about no stack. stacktop:ist zwar der linker fehler weg, aber das eigentliche problem bleibt. Das Programm stürtzt beim starten einfach mit einem Fehler ab... (NTVDM-CPU hat einen ungültigen befehlt entdeckt).
Ich bin ratlos und hoffe ihr könnt mir helfen
Gruss
-
int 0x80du versuchst ein linux program unter windows auszuführen

-
Ui das ist ja schonmal ein hinweis

Muss das ganze Programm für windows anders aussehen oder reicht es die zeile zu ändern/entfernen? (wollte erstmal nur IRGENDWAS haben was läuft damit ich dran rumspielen kann
-
Muss das ganze Programm für windows anders aussehen oder reicht es die zeile zu ändern/entfernen?
Ja, das Programm muss für Windows ein wenig anders aussehen. Es sollte zumindest keine Linux-spezifischen Systemaufrufe enthalten. Ansonsten kann es beliebige Folge von Assembler Befehlen enthalten.
Bei Windows musst du bei Applikationen grob unterscheiden zwischen WinAPI Programmen und Programmen für MSDOS-Konsole.
Es gibt Leute, die ganze Win API Programme in Assembler schreiben - davon rate ich persönlich ab. MSDOS-Konsole - verdammt lang her, zu langweilig, 16 Bit und so was, rate ich auch ab.
Warum programmierst du nicht gleich unter Linux? Es gibt nasm, glaube ich, auch für Linux. Ein lauffähiges "Hello World"-Programm hast du schon. Dann kannst du im Laufe der Zeit auf leistungsfähigere Werkzeuge umsteigen, wie GNU Compiler Collection mit den ganzen binutils. nasm allein ist zu schwach, binutils ist eine Art Waffe...
-
Hmm unter linux gibt es keine restriktionen nach dem motto "in dem modus geht das und in dem das"? Und wie läuft das unter Linux mit der "LinAPI :D, gibts da was vergleichbares oder wie öffnet man z.B. dateien?)
-
KA, was du genau mit "Modus" meinst, aber ohne Restriktionen irgendeiner Art kommt kein in einem Betriebssystem laufendes Programm aus.
Die Linux API funktioniert ueber Aufrufe von Funktionen in int 0x80, die mit dem eax-Register indiziert werden.
Mehr dazu findest du zB. in den FAQ verlinkt zwischen den Tutorials fuer AT&T und unix...BTW: NASM gibt es auch fuer Linux und ich wuerde auch empfehlen, den oder evtl. fasm zu benutzen, statt den gas, der bei den binutils dabei ist. ...Es sei denn du stehst irgendwie auf die AT&T-Syntax.
-
Und wie läuft das unter Linux mit der "LinAPI :D, gibts da was vergleichbares oder wie öffnet man z.B. dateien?)
Die Dateien öffnet man auch über einen Systemaufruf (zufällig 0x80...). Der Handle auf die Datei steht nach der Ausführung in %eax:
fname: .asciz "tmp.txt" movl $5, %eax movl $fname, %ebx movl $0, %ecx # O_RDONLY int $0x80Unter Linux ist übrigens alles eine Datei, kannst z.B. auch einen USB-Stick wie eine Datei öffnen und rumschreiben bis zum geht nicht mehr (ob es Sinn macht, sei dahingestellt

-
abc.w schrieb:
Die Dateien öffnet man auch über einen Systemaufruf (zufällig 0x80...)
das hat nichts mit zufall zu tun, alle syscalls werden via int 0x80 ausgeführt :). die ausnahme mögen x86_64 architekturen bilden, hier spendiert uns der cpu die neue instruktion
syscall
edit: @mods, syscall bitte in die keywordlist für das syntaxhighlighting aufnehmen

-
super, danke!
