com-programm



  • --------------------------------------------------------------------------------

    Hallo
    Warum kann ich aus diesm Code kein Com-Programm erzeugen.
    Es geht nur ein exe-Programm
    Grüße

    %OUT-------------------------------------------------------------------------
    %OUT- Written by Ferdi Smit for use with the "ASM Tutorial Part 1" -
    %OUT-------------------------------------------------------------------------
    ; To compile: TASM examp1.asm -
    ; TLINK examp1.obj -
    ;----------------------------------------------------------------------------
    .model small
    .stack
    .data
    message db "Hello world, I'm learning Assembly !!!", "$"
    .code
    main proc
    mov ax,seg message
    mov ds,ax

    mov ah,09
    lea dx,message
    int 21h

    mov ax,4c00h
    int 21h
    main endp
    end main



  • Postest du deine Fragen immer in zwei Foren gleichzeitig ?



  • Spricht etwas dagegen??



  • 1.Problem: Es muss ".model tiny" heissen.
    2.Problem: es gibt kein Stacksegment. => ".stack" muss weg
    3.Wie man sieht fuehlen sich einige User verstaendlicherweise ver******, wenn du die gleiche Frage in mehreren Foren stellst 😉 Solche Unternehmungen laufen dann auf eigene Gefahr 😃

    [ Dieser Beitrag wurde am 07.06.2002 um 21:11 Uhr von Nobuo T editiert. ]



  • Vielen Dank.
    warum ist das so wichtig ob das Model tiny oder small ist?
    Das vestehe ich als Anfänger noch nicht so richtig.
    Übrigens geht solchen Angaben immer ein Punkt hervor.
    z.B
    .model small
    .stack
    .data
    Was hat der Punkt in Assembler zu bedeuten?
    Übrigens ist die Sache mit zwei Foren is nicht irgendwie
    nicht schlecht gemeint. Ziel ist die Sprache so schnell
    wie möglich die Sprache zu lernen.

    PS:
    Wenn im Code steht:
    org 100h
    soll bedeuten:
    fängt bei offset 100h an (kein Stack)
    Was bedutet das?

    Grüße



  • Der "." vor einem reservierten Schluesselwort (zB. model) ist MASM-Syntax und kuendigt einfach einen Compilerbefehl an...
    Wenn du in TASM in die erste Zeile hinter Comments o.ae. ein "IDEAL" schreibst, kannst du diese Punkte weglassen.

    So. nun noch eine Zusammenfassung der gueltigen Speichermodelle:
    tiny - Code, Daten und Stack liegen beim Programmstart alle in einem 64K-Segment. Im selben Segment liegt auch das Program Segment Prefix (PSP). das belegt die ersten 256Bytes des Segments, deshalb faengt der code bei Offset 100h an. Dieser Entrypoint laesst sich in .com-Dateien auch nicht veraendern, da sie keinen header haben.
    (cs=ds=es=ss)

    small - Code und Daten sind in verschiedenen Segmenten. Das geht in einer.com-Datei nunmal nicht. (cs=codeseg ds=ss=dataseg es=PSP)

    medium - Es gibt mehrere Code-segmente und ein Datensegment.

    compact - Es gibt ein Codesegment und mehrere Datensegmente.

    large - Es gibt mehrere Code- und Datensegmente

    huge - Das gleiche, wie "large"

    tchuge - das gleiche, wie "large", aber ss und ds wird nichts zugeordnet...

    tpascal - Speichermodell, das von frueheren Pascalversionen benutzt wird...

    flat - Fuer Windows-programme. Eigentlich das gleiche, wie "small", nur dass mit ds und ss fast der gesamte Speicher addressiert werden kann (4gb)

    Mit Org laesst sich das Offset von Daten oder Code festlegen... So musst du zB. vor den Code einer .com-Datei entweder "org 100h" oder "startupcode" schreiben (hat die gleiche Wirkung), da der Code nunmal nach Offset 0100h in den Speicher kopiert wird. Fuer den Compiler bedeutet das dann einfach, dass er zu allen nicht-relativen Addressen 100h addieren muss.

    Zum schluss noch eine Demo eines "IDEAL"-codes:

    IDEAL
    P386
    model tiny

    dataseg
    HelloMsg db "Hello World!$"

    codeseg
    org 100h

    Start:
    mov dx,offset HelloMsg
    mov ah,09h
    int 21h

    ret ;springt in .com-Dateien ans Offset 0000h im Codesegment. Dort steht eine int 20h-Befehl, der das Programm beendet.

    END Start



  • Also einfach weltklasse.
    Tausendmal dankeschön, für die so ausführliche und gute Erklärung
    Grüße



  • Hmm ... an dieser Stelle hätte ich gleich mal eine Frage. Wie wirkt sich das Speichermodell denn nun faktisch auf den Gebrauch der Segmentregister aus (mal ganz abgesehen vom Modell 'flat'). Die gleiche Frage hätte ich auch zu dieser ASSUME Direktive. Wie wirkt sich das auf den Umgang mit Segmenten aus?



  • Eigentlich ist assume meist eher hinderlich 🙄
    Wenn man damit einen Segmentregister einem bestimmten Segment zuordnet, kann man mit diesem Segmentregister nur noch dieses eine Segment addressieren (bis man wieder assume benutzt und das Register einem anderen Segment zuweist)

    Die Speichermodelle sind groesstenteils eigentlich humbug. Die einzigen 3, die ich fuer halbwegs sinnvol erachte sind: tiny, large und flat.
    zB. kann man, wenn man im model compact, code einfach in ein Datensegment schreibt trotzdem mehrere Codesegmente haben, auch wenn dieses Speichermodell eigentlich nur eines zulaesst 🙄 Und wozu zB. small gut sein soll ist mir auch nicht ganz klar.
    Wahrscheinlich sind diese Dinger zusammen mit assume eher dann sinnvoll, wenn man Procs fuer bestimmte Hochsprachen schreibt 😕
    In so fern hat also das Speichermodell nichts direkt mit den Segmentregistern zu tun.


Anmelden zum Antworten