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     0x80
    

    aufrufen tu ich beides mit:

    nasm.exe -f obj hallo.asm
    alink.exe hallo.obj -oEXE -entry _start
    

    soweit 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     0x80
    

    du 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 $0x80
    

    Unter 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! 🙂


Anmelden zum Antworten