Assume
-
Kann mir bitte jemand möglichst in eigenen Worten erklären wozu die ASSUME Direktive beim TASM gut ist? Ich hatte mein CODE Segment so deklariert:
code segment use16 ;... code ends
Da drinne war auch der EntryPoint des Programms. Nun hat mir der Linker mehrere Fehlermeldungen ausgegeben. Immer was mit "CS unreachable ..." blah blah. Dann habe ich ein "assume cs:code" gesetzt und es ging tadellos. Wozu ist dies denn gut? Also für mich macht das überhaupt keinen Sinn.
-
Jo, du musst, wenn du die Segmente so einrichtest die Segmentregister immer mit Assume zuordnen... Ich erkenne da auch ueberhaupt keinen Sinn drin, ist aber nunmal so :o
Wozu es uU gut sein koennte ist folgender Fall:Segment BlaDaten1
...
Irgendwas1 db ...
...
ENDS BlaDaten1Segment BlaBlub
...
Irgendwas2 db ...
...
ENDS BlaBlubSegment Code
assume cs:Code,ds:BlaDaten1,fs:BlaBlub
...
mov al,[Irgendwas1] hier wird dann ds zum Addressieren benutzt
mov al,[Irgendwas2] und hier fs...ENDS Code
-
Ok, dann nehme ich das mal so hin. Danke für die Antwort.
Ich habe nämlich mehrere Segmente für meinen kleinen Brainf*ck Interpreter gebraucht.
-
theoretisch müsste das beispiel mit deinem code funzen und der linker müsste erkennen könnte das das segement "code" dein quellcodesegement ist (weil es einen einsprungpunkt gibt oder du nur ein segment hast)
und cs automatisch darauf ausrichten. aber es muss nicht immer so sein.
wenn du z.b. 2 segmente mit quellcode und einsprungpunkt hast weiss der linker nicht, welches segment den code enthält das er beim programmstart ausführen soll und kann daher cs nicht automatisch mit der korrekten segmentadresse dieses segments laden. oder du hast mehrere segmente ohne einsprungpunkte (muss ja nicht sein), dann weiß der linker ebenfalls nicht welches segment den code zum ausführen enthält. da cs vom linker immer automatisch mit einer gültigen segmentadresse initialisiert wird, braucht der linker dann auch vorher die info welches segment den code enthält.
hoffe das ist so korrekt.tenim
-
assume hat auch seinen sinn, wenn man indexregister verwendet:
nehmen wir an du hast ein array im datensegment und du willst das bp register
benutzen, um auf die elemente zuzugreifen. das problem ist, dass wenn du einfach:
mov [array+bp],0
schreibst, dann wird der assembler das als mov ss:[array+bp],0 schreiben und
somit das falsche segmentregister benutzen, weil das bp register das ss register
als segment voraussetzt. wenn du aber vorher mit assume klargestellt hast, dass
deine daten durch das ds register adressiert werden dann wird der assembler
erkennen, dass dein array im datensegment steht und somit den befehl auch
mit:
mov ds:[array+bp],0
übersetzen.
-
Loggy was ist mit dir los? Warum kennst du dich auf einmal mit Assembler aus?