Beispiel-Assemblercode nicht ausführbar. Was ist falsch?



  • Wenn ich folgenden code übersetzte:

    org 100h
    start:
      mov ax, 5522h
      mov cx, 1234h
      xchg cx,ax 
      mov ah,4Ch
      int 21h
    
    nasm first.asm -f bin -o first.bin
    

    Jetzt fehlen ihm noch ausführechte, ich weis zwar nicht warum...

    chmod +x first.bin
    

    und nun ausführen will bekomme ich folgenden fehler:

    storm@localhost ~/C-C++/Assembler $ ./first.bin
    bash: ./first.bin: cannot execute binary file
    

    Ich glaube ich übersetzte das Programm falsch, wie mache ich es richig?

    PS: Das ganze gehört zu einem wikibook, das ich gerade lese, dort soll amn es unter MS-DOS ausführen ich mach das ganze unter linux, benutze aber nasm wie im wikibook beschrieben.



  • Storm.Xapek.de schrieb:

    Wenn ich folgenden code übersetzte:

    org 100h
    start:
      mov ax, 5522h
      mov cx, 1234h
      xchg cx,ax 
      mov ah,4Ch
      int 21h
    
    nasm first.asm -f bin -o first.bin
    

    Jetzt fehlen ihm noch ausführechte, ich weis zwar nicht warum...

    chmod +x first.bin
    

    und nun ausführen will bekomme ich folgenden fehler:

    storm@localhost ~/C-C++/Assembler $ ./first.bin
    bash: ./first.bin: cannot execute binary file
    

    Ich glaube ich übersetzte das Programm falsch, wie mache ich es richig?

    PS: Das ganze gehört zu einem wikibook, das ich gerade lese, dort soll amn es unter MS-DOS ausführen ich mach das ganze unter linux, benutze aber nasm wie im wikibook beschrieben.

    Kann gut sein, das ich dir net helfe, aber versuchs mal so:
    Lad dir dosbox (ist ein dosemulator) runter und bennene deine binaries in *com dateien um. Jedenfalls hab ich das so gemacht.



  • Aber man müsste das doch auch unter linux ausführen können.
    Der assembler ändert sich ja nicht, ich benutzt ja nasm und habe einen intel rechner. Wie übersetzt ihr eure Programme den??



  • Storm.Xapek.de schrieb:

    Aber man müsste das doch auch unter linux ausführen können.
    Der assembler ändert sich ja nicht, ich benutzt ja nasm und habe einen intel rechner. Wie übersetzt ihr eure Programme den??

    Du willst also ein Dosprogramm OHNE EMULATOR auf Linux laufen lassen? Interessant.
    der DOS Interrupt 0x21 (oder 21h) ist ja ein DOS Interrupt ist nur unter DOS vorhanden. (In windows wird dieser Emuliert). Wie gesagt:
    Lad dir dosbox runter, mounte dann ein verzeichnis (mit deinem programm) als laufwerk , wechsele in dieses Verzeichnis und führe dann dein programm aus. Aber bitte ein *.com Programm. *.bin dürfte nicht gehen.



  • das kannst du dir so vorstellen:

    angenommen du machst ein normales C Programm, dass die WinAPI benutzt,
    dann kannst du das nicht einfach auf Linux laufen lassen,
    da es auf Linux kein WinApi gibt

    und so ist das auch mit DOS,
    wenn du ein Programm schreibst das die DOS Interrupt 0x21 benutzt,
    läuft das ohne Emulation auch nur auf DOS



  • Stimmt das mit denn interrupts hab ich net bedacht.
    Ich dachte assembler sei nur machinenabhänig und nicht systemabhänig,
    also liegts nur an den interrupts der rest müsste gehn oder?



  • org 100h
    start:
       mov ax, 5522h
       mov cx, 1234h
       xchg cx,ax
       mov ah, 4Ch
       ;int 21h
    

    Funktioniert auch nciht,
    hab ich ewuch jetzt falsch verstanden, oder mach ich generell noch was anderes falsch?

    PS: Ich besorg mir jetzt mal einen DOS emulator, wolltes aber am besten ohne laufen lassen wenn das möglich ist.



  • Storm.Xapek.de schrieb:

    org 100h
    start:
       mov ax, 5522h
       mov cx, 1234h
       xchg cx,ax
       mov ah, 4Ch
       ;int 21h
    

    Funktioniert auch nciht,
    hab ich ewuch jetzt falsch verstanden, oder mach ich generell noch was anderes falsch?

    PS: Ich besorg mir jetzt mal einen DOS emulator, wolltes aber am besten ohne laufen lassen wenn das möglich ist.

    Lad dir doch einfach dosbox runter. Damit funktioniert es wunderbar. Hab ich selber schon gemacht. Was assembly unter linux angeht:
    http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

    Unter Linux nutzt man den interrupt 0x80.

    Und google mal nach nem 32bit asm Tutorial(Wenn du unter linux ASM-pogrammieren willst OHNE EMULATOR).



  • org 100h funktioniert schon mal nicht, da ELF (das heutige Binärformat von Linux) einen anderen Einsprungspunkt benutzt. 0x100 war afaik der Einspungspunkt von DOS COM Dateien.

    Besorg dir einfach mal ein paar Linux Assembler Tutorials (siehe FAQ und Google). Mit 16Bit DOS Assembler kommst du nicht mehr weit.

    @gaser
    oder sysenter.


Log in to reply