ich bringe es nicht...



  • Hm, kannst du Englisch 😕

    Die Ausgabe sagt doch alles. No stack segment -> kein Segment für einen Stack. Du benutzt push und pop um Daten auf den Stack zu schieben und wieder zu lesen, hast aber keinen Stack definiert. Wo soll das Programm die Daten jetzt hinschieben?



  • Die Meldung kannst Du getrost ignorieren - zumindest solange model TINY verwendet wird (und die besagt dass man eigentlich eine COM haben möchte). Denn da beginnt der Stack bei 0ffffh und wächst nach oben - der Applikation entgegen. Bei dem kleineren Code sollte es keine Probleme geben, da er keinen Stack verwendet. Die Warnung verschwindet auch wenn man den Linker richtig aufruft (siehe unten).

    Um eine Ausgabe auch zu sehen: dein Programm von Kommandozeile aus aufrufen 😉 (zumindest das kleine). Oder eben eine Lesefunktion einbauen, so dass das Programm nach der Ausgabe nicht eben geschlossen wird.
    Imho sind beide Queltexte für COM dateien (oder wozu sonst soll das org 100 da sein? *mich mit 16-bit assembly nicht so auskenn* )
    um auch eine COM zu bekommen.
    Hab jedenfalls Deinen ersten Code assembliert (den ohne Punkt ;)):

    CSEG segment
    org 100h
    
    Begin:
    
        mov ah,9
        mov dx,offset Message
        int 21h
    
        int 20h
    
    Message db 'Hello, world!$'
    
    CSEG ends
    end [b]Begin[/b]
    

    ml /AT /c test.asm
    AT steht dafür dass man hier COM haben will, /c verhindert den linker aufruf
    linken:
    link /TINIY test.obj
    und voila, eine coole 23 byte große COM kommt raus.
    ist man zu faul diese aus der Konsole aufzurufen, muss man nur nach der int 21h noch

    mov ah,1
    int 21h
    

    einfügen.
    möchtest Du stattdessen Exen erstellen: lass eben AT und Tiny weg.
    zum zweiten code:
    mit denselben aufrufen klappts bei mir auch - und die Ausgabe sieht man dann auf jedenfall 😉
    Viel Spass noch mit der DOSe



  • Moin CDW,

    CDW schrieb:

    Denn da[im Modell Tiny] beginnt der Stack bei 0ffffh und wächst nach oben - der Applikation entgegen.

    Das ist aber ein böser Fehler. Der Stack beginnt nicht (in Worten: nicht) bei Adresse 0x0000 und wächst dann nach oben, weder bei COM noch bei EXE. Per definitionem wächst ein Stack immer von hohen zu niedrigen Adressen.

    Wenn Du ein COM-Programm startest, so ist das Register SP mit dem Wert 0xfffe belegt. Pusht Du nun einen (Word-)Wert auf den Stack, so zeigt SP dann auf Adresse 0xfffc, d.h. der Stackpointer wurde um 2 erniedrigt. Der Stack wächst der Anwendung tatsächlich entgegen, aber eben nicht von "unten" sondern von oben, von der höheren Adresse her.

    Ciao...



  • 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?


  • Mod

    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 🙄


Anmelden zum Antworten