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. :confusedWeiss 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).