ich bringe es nicht...
-
Der Stack beginnt nicht (in Worten: nicht) bei Adresse 0x0000
hab ich ja niemals behauptet
CDW schrieb:
Denn da beginnt der Stack bei 0ffffh(der Stackpointer müsste natürlich auf 0fffeh zeigen, damit man die Bytes auf 0fffe und 0ffff adressiert)
aber eben nicht von "unten" sondern von oben, von der höheren Adresse her
sorry, da habe ich mich wohl missverständlich ausgedrückt, ich gehe von einem solchen "bildlichen" Speichermodell aus:
0000 0100h <-Anwendung 0130h <-Anwendung ... fffeh <-Stackanfang (wert im SP) ffffh
also wächst er bei mir von unten nach oben, der Applikation entgegen
dieses Modell hatte ich damals in der Schule und auch in diversen Debuggern (wie Olly), daran bin ich so gewonnt dass ich nicht bedacht habe dass man es auch anders sehen kann.
-
Moin CDW,
da habe ich mich wohl verlesen. Sehr merkwürdig...
Allerdings sollte man mit solchen Bildern des Speicheraufbaus nicht arbeiten, weil sie eben nicht eindeutig sind. Eindeutig ist die Angabe der Adressen.
Ciao...
-
danke euch, es klappt, bekomme zwar keine exen die dann auch funktionieren, aber ich übe erstmal für DOS und das COM ist ja für DOS -) ach naja, die Warnung ist trotzdem noch da, kann man das irgendwie lösen?
-
Moin raycon,
die Warnung, dass kein Stacksegment vorhanden ist, erzeugt der Linker, weil Du ihm nicht mitgeteilt hast, dass Du ein TINY-Programm erstellen möchtest. Die korrekten Kommandozeilenparameter lauten:
ml /AT /c DeinProgramm.asm
link16 /TINY DeinProgramm.obj,DeinProgramm.com;Warum kannst Du keine EXE erzeugen? Hier mal ein Beispiel:
DATA SEGMENT WORD MsgText db 'Tach auch...$' DATA ENDS STACK SEGMENT STACK dw 512 dup(0) STACK ENDS CODE SEGMENT WORD assume CS:CODE,DS:DATA,SS:STACK start: mov ax, SEG DATA mov ds, ax mov ah, 09h mov dx, offset MsgText int 021h mov ax, 04c00h int 021h CODE ENDS end start
Übersetzen mit:
ml /c Beispiel.asm
link16 Beispiel.obj;Ciao...
-
Kal El schrieb:
Moin raycon,
die Warnung, dass kein Stacksegment vorhanden ist, erzeugt der Linker, weil Du ihm nicht mitgeteilt hast, dass Du ein TINY-Programm erstellen möchtest. Die korrekten Kommandozeilenparameter lauten:
ml /AT /c DeinProgramm.asm
link16 /TINY DeinProgramm.obj,DeinProgramm.com;Warum kannst Du keine EXE erzeugen? Hier mal ein Beispiel:
DATA SEGMENT WORD MsgText db 'Tach auch...$' DATA ENDS STACK SEGMENT STACK dw 512 dup(0) STACK ENDS CODE SEGMENT WORD assume CS:CODE,DS:DATA,SS:STACK start: mov ax, SEG DATA mov ds, ax mov ah, 09h mov dx, offset MsgText int 021h mov ax, 04c00h int 021h CODE ENDS end start
Übersetzen mit:
ml /c Beispiel.asm
link16 Beispiel.obj;Ciao...
Alles Schrott!
Ein TINY-Speichermodel mit einem Code und Daten Segment?????
Bei einem TINY-Speichermodel (*.com Datei) gibt es kein Code/Datensegment!!!
Daten + Code + Stack liegen alle in einem Segment der max. 64kb groß sein kann
Oder irre ich mich?Dein Beispiel kann man nicht als tiny weder assemblieren noch linken!!!!!!!!
-
Ja, du irrst dich. Was willst du denn sonst machen? Absolute Adressen angeben? Der Linker macht das schon richtig.
Ich hab das Beispiel zwar nicht ausprobiert, aber es schaut ganz vernünftig aus.
-
Hallo "Keine Ahnung",
Du machst Deinem Namen wirklich alle Ehre. Aber mir ist es in diesem Thread ja auch schon passiert, dass ich ein Posting nicht richtig gelesen habe.
Schau Dir mein Posting, das Du so nett zitiert und kommentiert hast, doch nochmal genau an.
Raycon hatte in seinem Posting davor angegeben, dass er keine EXE erzeugen könne. Das Beispiel, das ich in dem, von Dir als Schrott bezeichneten, Posting angegeben hatte, sollte die Erstellung einer EXE-Anwendung zeigen. Dazu ist das Lesen des Satzes vor dem Listing recht aufschlussreich. Soweit ich nun informiert bin, nutzen unter DOS EXE-Programme die Speichermodelle SMALL, MEDIUM, COMPACT, HUGE oder LARGE. Jedoch nur Programme mit der Endung .COM benutzen das Speichermodell TINY. Das Listing macht irgendwie den EIndruck, als ob es das SMALL-Speichermodell verwendet.
Wenn Du Dir weiterhin die Kommandos zum Übersetzen des Listings anschaust(am Ende des Postings), wirst Du erkennen, dass ich keine Angaben zur Erzeugung des Speichermodells TINY gemacht habe.
Des Weiteren läßt ein scharfer Blick auf das Listing erkennen, dass nirgens ein org 100h auftaucht. Das müsste jedoch vorhanden sein, weil es sonst Fehlermeldungen hagelte, wenn ich ein TINY-Programme erstellen wollte und dabei die vollständige Segmentkontrolle verwende.
Um mit Dieter Nuhrs Worten zu sprechen: Wenn man keine Ahnung hat(oder so heißt), einfach mal die Fresse halten. :p
Vorzügliche Grüße
-
Stimmt, das hab ich jetzt auch übersehen. Naja, ist auch schon etwas länger her, dass ich DOS-Programme mit Assembler gebaut habe
-
Ja schon gut Leute, ich habs wirklich übersehen, sorry :p
Ich dachte aus dem Beispielcode sollte eine *.com Datei werden
-
Wenn Du ein COM-Programm startest, so ist das Register SP mit dem Wert 0xfffe belegt
Deswegen kann man die Warning allerdings ignorieren. Da beim COM Programm
nur ein Segment (64KByte) benutzt wird, liegt der Stack Pointer bei
0xfffe doch ganz gut.Warum eigentlich 0xfffe und nicht 0xffff(ok 0x0000), hat das Betriebssystem da schon
einige Bytes vom Stack benutzt?
-
0xffff wär schlecht, dann wär der stackpointer nähmlich unausgerichtet
logisch wäre ein anfangswert von 0, allerdings kann man ein programm auch einfach mit einem (near) ret beenden (und die rücksprungadresse befindet sich eben schon auf dem stack, daher SP=0xfffe), was dann einen rücksprung auf eine adresse in den ersten 100h bewirkt wo ein codefragment liegt, dass die normale dos endsequenz ausführt. ist eins der vielen CP/M relikte.
-
underscore ist doch kein Punkt sondern ein unterstrich