error bei tasm,nasm,masm,yasm u.s.w



  • Hallo, bin Anfänger in ASM.
    Versuche gerade ein COM datei zu erstellen aus einem buch.
    CODE:

    CSEG segment
    org 100h
    _start:
    mov ah,9h
    mov dx,offset msg
    int 21h
    int 20h
    msg db 'Hallo welt$'
    CSEG ends
    end _strat
    

    .. Und alle oben genante assembler bringen error.
    Aber ich habe

    CSEG segment
    offset
    SCEG ends
    

    gelöscht und es hat geklappt, meine frage warum ?
    Was ist falsch? Das Buch, oder Autor von Buch..
    Danke.



  • nooby81 schrieb:

    Was ist falsch? Das Buch, oder Autor von Buch..

    Na, wer wohl 😉 ? Welches Buch? Welcher Autor? Nimmst Du die Programme von damals, bzw. welche Programme genau(!) nimmst Du? Wie lauten die Fehlermeldungen?

    Zu Masm:

    Bestimmt nimmst Du den falschen Linker, eventuell auch den falschen Masm. Du brauchst einen Linker für 16-Bit-Dos-Programme. Wenn Du Masm aus dem Masm32-Paket benutzt, dann lautet die Kommandozeile:

    ml.exe /AT /Bl"link16.exe" hallo.asm

    Zu Tasm:

    Es gibt im Netz ein Tasm, das gar kein Tasm ist, sondern ein völlig anderer und sehr spezieller Assembler. Beim Original-Tasm von Borland lauten die beiden Kommandozeilen:

    `TASMX.EXE /t Hallo.asm

    TLINK.EXE /x /t Hallo.OBJ`

    Zu Nasm:

    Nasm hat eine andere Syntax. Dein Programm dort müsste so aussehen:

    BITS 16
    org 100h
    mov ah,9h
    mov dx, msg
    int 21h
    int 20h
    msg db 'Hallo welt$'
    

    Und die Kommandozeile:

    nasm.exe -fbin -oHallo.com Hallo.asm

    Yasm dürfte genauso laufen (habe ich nicht ausprobiert). Ein Assembler mit dem Namen "u.s.w" ist mir unbekannt.

    viele grüße
    ralph



  • Also ich bin ein gnu/linux user.
    Lehrne assembler unter dosbox + pdf Bucher. Leider ist der Autor mir nicht bekannt, nur das Jahr "2006". Habe für dosbox masm und tasm heruntergeladen und ich habe nur masm.exe, link.exe, tasm.exe. Wie du geschrieben hast zu nasm nasm.exe -fbin -oHallo.com Hallo.asm funktioniert supper aber halt unter linux und ohne cseg segment. Natürlich habr ich andere Bücher aber in dem Buch ist alles so verständlich erklärt.
    Ah... aufgebun will ich nicht, da ich schon c/c++ kenne, will ich auch asm kennen. u.s.w steht für Und So Weiter :-). Ich glaube das ich was falsches runterladen habe.... was assembler angeht :-). ... danke Ralph !!!
    Gibt's überhaupt gute Bücher für solche wie mich, wahrscheinlich hätte ich zuerst assembler gelernt und dann c/c++.



  • ah ja.... gibt's überhaupt noch masm 5.x im Netz ?



  • nooby81 schrieb:

    ah ja.... gibt's überhaupt noch masm 5.x im Netz ?

    Ja, Google hat mir diesen Link dazu ausgegeben:
    http://microprocessados.lesc.ufc.br/downloads/Laboratorio/masm51.zip

    Dirk



  • Also, habe masm5 runter geladen.
    Mit dem Code:

    CSEG segment
    org	100h
    Beginn:
    	mov ah,09h
    	mov dx,offset msg
    	int 21h
    	int 20h
    msg db  'Hallo dosBox$'
    CSEG ends
    end Beginn
    

    Fehler: error A2062: Missing or unreacheble CS.
    Warum aber bei dem Buchautor klappt es. 😡



  • Es geht mit:

    assume cs:CSEG
    

    Warum ?



  • nooby81 schrieb:

    Also, habe masm5 runter geladen.
    Mit dem Code:

    CSEG segment
    org	100h
    Beginn:
    	mov ah,09h
    	mov dx,offset msg
    	int 21h
    	int 20h
    msg db  'Hallo dosBox$'
    CSEG ends
    end Beginn
    

    Fehler: error A2062: Missing or unreacheble CS.
    Warum aber bei dem Buchautor klappt es. 😡

    Mit Masm 5.1 wirst Du nicht glücklich. Um eine .com-Datei zu erstellen, brauchst Du noch exe2bin.exe, was nicht im Masm-Paket, aber beim Betriebssystem zu finden ist. Wie Du richtig bemerkst, wird mit "assume cs:CSEG" assembliert. Damit weiß der Assembler, dass alle Befehle, die sich auf das CS-Register beziehen (z.B. Sprungbefehle), relativ zum Beginn von CSEG zu berechnen sind. Da Du mit 'mov dx,offset msg' auch einen Befehl hast, der sich auf das DS-Register bezieht, brauchst Du auch eine Assume-Angabe für DS. Also:

    CSEG segment
    assume cs:CSEG, ds:CSEG
    org 100h
    _start:
    mov ah,9h
    mov dx,offset msg
    int 21h
    int 20h
    msg db 'Hallo welt$'
    CSEG ends
    end _start
    

    Kommandozeile:
    `MASM.EXE Hallo.asm ,,,,

    LINK.EXE Hallo.obj ,,,,

    exe2bin.exe Hallo.exe Hallo.com

    `
    Die übriggebliebene Hallo.exe ist nicht lauffähig und produziert einen Absturz (wg 'org 100h').

    Mach es Dir einfacher und installiere das MASM32-Paket:

    http://www.codingcrew.de/masm32/index.php

    Der dortige MASM (ml.exe) kann auch .com-Dateien herstellen. Und zwar ohne Probleme unter Windows, da es sich um ein 32-Bit-Programm handelt.

    viele grüße
    ralph



  • nooby81 schrieb:

    Es geht mit:

    assume cs:CSEG
    

    Warum ?

    Erst mit der ASSUME Directive wird dem Assembler mitgeteilt das "CSEG"(nur ein beliebiger Name) ein Code-Segment ist.

    http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH08/CH08-3.html

    8.8.10 Controlling Segments with the ASSUME Directive

    ....

    8.8.6 The USE16,.....
    For most DOS programs, you will always want to use the use16 operand.

    CSEG segment use16
    assume cs:CSEG, ds:CSEG
    org 100h
    ;
    CSEG ends
    

    Dirk



  • Danke jungs !!!!



  • .com Programme kann man am unproblematischsten mit fasm erstellen. Auf 16 Bit müssen die nicht beschränkt sein (128 gehen auch), so brauchsts auch kein exe2bin (welches zu allem Überfluss nicht in allen Windowsen arbeitet wie es soll).

    Wenn man ein 32 Bit Windows hat, dann kann man aber kleine Programme wie diese auch problemlos mit Debug erstellen. .com Programme machen (erstmal) keinen so großen Unterschied zwischen Code und Datensegmenten. Hier ist eher interessant, wann man denn überhaupt in einem anderen Segment ist 😉

    (Neuere Masm-Syntax kann man auf der Microsoftseite studieren.)



  • soodaso schrieb:

    .com Programme kann man am unproblematischsten mit fasm erstellen. Auf 16 Bit müssen die nicht beschränkt sein (128 gehen auch),

    Ja richtig 64 Bit MMX-Register und 128 Bit XMM-Register darf man auch im 16 Bitmode schon verwenden so wie auch die FPU.
    Und wird vom .com aus selber in den 16 PM geschaltet, dann kann der gesamte 32 Bit Adressraum damit auch addressiert werden(ab 80386 mit Adresssize-Prefixen).
    Mit einem x64 kann dann auch in den 64 Bit-Mode geschaltet werden.

    so brauchsts auch kein exe2bin (welches zu allem Überfluss nicht in allen Windowsen arbeitet wie es soll).

    Wenn man ein 32 Bit Windows hat, dann kann man aber kleine Programme wie diese auch problemlos mit Debug erstellen. .com Programme machen (erstmal) keinen so großen Unterschied zwischen Code und Datensegmenten. Hier ist eher interessant, wann man denn überhaupt in einem anderen Segment ist 😉

    (Neuere Masm-Syntax kann man auf der Microsoftseite studieren.)

    Mit neuem "Masm-Syntax" sind dann wohl die Versionen ab 6.xx gemeint, weil MASM 5.1 kennt noch keine MMX-Befehle.

    Sollte der Platz für unseren Code+Daten in der .com-Datei nicht ausreichen können beliebige Daten ggf. aus dem aktuellem Verzeichniss nachgeladen werden.
    Beschränkungen sind damit auch nicht wirklich vorhanden. Nur das wir keine "Relocation-Table" im Vergleich wie in einer .exe mitbringen und wir diese Adressen ggf. selber berechnen müssen insofern wir sie benötigen.

    Dirk


Anmelden zum Antworten