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,axmov ah,09
lea dx,message
int 21hmov 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 stellstSolche 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 tinydataseg
HelloMsg db "Hello World!$"codeseg
org 100hStart:
mov dx,offset HelloMsg
mov ah,09h
int 21hret ;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 zulaesstUnd 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.