cs wird ueberschrieben



  • ich arbeite unter xp mit dem tasm.
    das programm moechte ich mir nur im debugger anschauen;
    es soll also ganz einfach sein :D.
    mein problem ist das irgendwann der beginn des codesegments ueberschrieben
    wird.
    das programm arbeitet das unterprogramm fuelle_speicher normal ab und springt
    auch bei RET zurueck zum start; allerdings hat sich der code dort geaendert.

    ich hab keine ahnung woran das liegen koennte.
    kann mir da jemand weiterhelfen; was ist falsch?

    IDEAL
    P186
    MODEL SMALL
    STACK 100h
    
    DATASEG
        Daten DB 256 DUP(0h)
        Anzahl EQU 256
    
    CODESEG
        START:
            CALL FUELLE_SPEICHER
    
            JMP ENDE
    
        FUELLE_SPEICHER:
            MOV BX, OFFSET Daten
            MOV CX, Anzahl
            MOV AL, 0H
        FS_SCHLEIFE:
            MOV [BX], AL
            INC AL
            INC BX
            DEC CX
            CMP CX, 0H
            JGE FS_SCHLEIFE
    
            RET
    
        ENDE:   JMP ENDE
            END
    


  • Dein Code an sich ist voll OK, weiß auch nicht, wo da der Fehler liegen könnte. 😕 Evtl. musst du aufpassen bei Call. Wenn es ein FAR-Call ist, muss am ende der aufgeruf. Routine "RetF" stehen. Ansonsten muss es ein NEAR-Call sein. Probier also mal, folgende Zeile

    Call Near FUELLE_SPEICHER

    cu todo



  • Original erstellt von todo:
    Dein Code an sich ist voll OK, weiß auch nicht, wo da der Fehler liegen könnte. :confused

    Weiss nicht, aber bei mir laesst sich der code so noch nicht mal linken. 🙄

    Hier eine ueberarbeitete Version des codes mit Erleuterungen. 🙂

    IDEAL
    P186
    MODEL SMALL
    STACK 100h
    
    DATASEG
        Daten DB 256 DUP(0h)
        Anzahl EQU 256
    
    CODESEG
        START: ;Nur hier globales label sonst wird der Entry-point nicht gefunden.
            mov ax,@DATA
            mov ds,ax  ;ds zeigt beim Start des Programms wie es aufs PSP.
                       ;das zu ueberschreiben waere nicht gerade vorteilhaft ;)
            CALL NEAR @@FUELLE_SPEICHER ;NEAR call, da small memory model.
    
            JMP short @@ENDE ;kurzer Sprung zu lokalem Label.
    
        @@FUELLE_SPEICHER: ;lokales label (so.)
            MOV BX, OFFSET Daten
            MOV CX, Anzahl
            XOR AX, AX ;scheint mir irgendwie eleganter...
        @@FS_SCHLEIFE:
            MOV [BX], AL
            INC AX
            INC BX
            DEC CX
    JNS short @@FS_SCHLEIFE ;hier brauchts kein cmp... wenn cx <0 wird, wird das
                            ;signed flag gesetzt. Wenn das der Fall ist, wird
                            ;nicht zurueckgesprungen.
            RET
    
        @@ENDE:   JMP short @@ENDE
            END START   ;auch sehr wichtig: Hier gehoert das Entry-Label hin!
    

    [ Dieser Beitrag wurde am 03.01.2003 um 15:48 Uhr von Nobuo T editiert. ]



  • hmmmm.
    danke erstmal fuer die ausfuehrlichen erlaeuterungen, das war mal
    noetig ;).
    aber ich hab folgendes festgestellt:
    falls ich die borland ide benutze um zu assemblen,
    wird zwar irgendeine .exe erzeugt, die macht aber in den seltesten
    faellen was sie soll. (???)
    uebersetzte ich die programme mit dem comand-line-tool funzt es;
    naja fast.
    ich habe jetzt all meinen programmen als erste zeile im codeseg
    "STARTUPCODE" hinzugefuegt. jetzt funktioniert alles wunderbar.

    allerdings weiss ich nicht warum ich es brauche.
    mein prof sagte mir, dass der tasm automatisch das ds register laedt.

    und der andere seltsame effekt: ich habe bereits aehnliche programme
    die funktionieren (onhe "STARTUPCODE"); am assembler hab ich
    nicht an den einstellungen rumgefummelt :D.

    naja wie gesagt jetzt funktioniert alles.
    aber wenn jemand eine erklaerung fuer das seltsame verhalten der programme
    hat, waers toll wenn er mir das mal kurz erlaetern koennte...
    ich bin im mom etwas verwirrt... 😮 😕



  • Normalerweise sollte TASM kein "Startupcode" erstellen, da wir ja in ASM alles selber machen wollen.
    Die Sache die du gesehen hast, könnten Com-files sein, oder Programme, die kein Datensegment haben, sondern die daten im Codesegment ablegen (wie Com-files).
    So weit ich weiß sind zu beginn der ausführung alle Segmentregister gleich, dh. gleich cs.

    mfg
    -bg-



  • meine programme funktionieren aber nur mit hilfe
    von startup.
    ich versuche normale programme (.exe :)) zu erstellen.
    ich benutze immer die selben einstellungen (siehe mein
    code-beispiel ganz oben).


Anmelden zum Antworten