keine Ausgabe bei assemblierter Datei



  • Hallo,

    ich habe mir aus einem Forum ein Beispielscipt herauskopiert:

    section .text    
    
    global _start   ; für den Linker (ld) notwendig  
    
    msg db 'Hello world',0x0A  ; unser Text incl. Zeilenumbruch LF (0x0A)  
    len equ $ - msg            ; Länge des Textes berechnen (12 Bytes) 
    
    _start:
      mov eax,4     ; Systemaufruf Nr. 4 (sys_write) Textausgabe 
      mov ebx,1     ; Ausgabekanal Nr.1 = stdout 
      mov ecx,msg   ; Adresse unseres Textes im Speicher 
      mov edx,len   ; Länge des Textes in Bytes 
      int 0x80      ; Kernel aufrufen mit obigen System-Aufrufparametern 
    
      mov eax,1     ; Systemaufruf Nr. 1 (sys_exit) Programmende
      int 0x80      ; Kernel aufrufen mit obigen System-Aufrufparametern
    

    Danach habe ich es mit
    nasm -fbin -o test.com test.asm
    assembliert.

    Erhalte aber dabei keine Ausgabe, wenn ich die com-Datei ausführe.
    Muss ich da noch irgendwas mit int 10 oder etwas ähnlichem hinzufügen



  • Hi.

    Es waere sinnvoll gewesen, noch das OS anzugeben, fuer das du programmierst.
    Der Fakt, das du eine .com-Datei erstellt hast und den int 10h verwenden willst, legt die Vermutung nahe, dass du unter Windows arbeitest und fuer DOS programmierst.
    In diesem Fall solltest du dir darueber im Klaren sein, dass der Codeabschnitt, den du kopiert hast, Systemaufrufe fuer Linux enthaelt und deshalb unter Windows/DOS nicht die gewuenschten Resultate bringen kann.

    BTW:
    Fuer alternative Tutorials fuer DOS/Win32 kannst du dich in den Assembler-FAQ umsehen. Dort gibt es aber auch kein Tutorial fuer NASM auf anderen Systemen als Linux.

    Meine Empfehlungen:
    1. Weniger blind C&P machen. 😉
    2a. Auf Linux umsteigen
    2b. Alternativ erstmal NASM-Syntax halbwegs verstehen, bzw. Unterschiede der Syntax zu TASM(/MASM) (gibt dazu auch einen Abschnitt in den NASM-Docs) und dann mit entsprechendem Tutorial fuer TASM weiterarbeiten.
    2c. Auf TASM umsteigen.



  • Moin, Moin...

    Das obige Assemblerprogramm ist für Linux geschrieben, NICHT für DOS. Wenn Du also eine Binärdatei erzeugst, ist diese unter Linux nicht ausführbar. Auch unter DOS wirst Du nichts sehen, da der Interrupt 0x80 unter DOS nicht definiert ist.

    Unter Linux muss die Datei zu einer Object-Datei assembliert und diese dann zu einer ELF-Datei gelinkt werden.

    Unter DOS musst Du die entsprechende Ausgabefunktion der DOS-API benutzen.

    Ciao...



  • Oh, na sowas. Linux.

    Ok, danke für die Tipps, dann werde ich es wohl mal unter Linux machen.
    Das dumm ist bloß, das TASM nicht als Freeware zur Verfügung steht und ich mit NASM den einzigen Freewareassempler gefunden habe.
    Aber ich bekomme das schon gebacken 😃



  • BasicMan01 schrieb:

    Ok, danke für die Tipps, dann werde ich es wohl mal unter Linux machen.
    Das dumm ist bloß, das TASM nicht als Freeware zur Verfügung steht und ich mit NASM den einzigen Freewareassempler gefunden habe.

    Nasm ist doch gut. Also ich persoenlich finde Nasm sehr nett. Wenn du lieber unter Windows programmierst, hier mal ne Hallo-Welt für DOS (nasm-tauglich und als COM nur 20 Bytes wobei schon 11 Bytes davon Text sind - kleiner habe ich's selbst noch nicht geschafft)

    ORG 100h         ; Com-Datei
      mov dx,msg     ; offset von msg nach dx
      mov ah,09h     ; funktion 09h (gibt $-terminierten string (offset in dx) aus)
      int 21h        ; aufruf ueber int 21h
      ret            ; ende der com-datei
    Daten:           ; daten segment
      msg db "Hallo Welt!","$"   ; unser string der ausgegeben werden soll
    

    Assembliert wird es dann z.B. mit nasmw -o datei.com datei.asm.



  • BasicMan01 schrieb:

    Das dumm ist bloß, das TASM nicht als Freeware zur Verfügung steht

    Wenn du dich auch mit TASM32 zufriedengibst: er ist im Borland C++BuilderX enthalten (1.0 oder 1.5).

    Moritz


Anmelden zum Antworten