Was genau macht die Assume-Anweisung?
-
Moin!
Wozu brauche ich bei MASM und TASM die Assume-Anweisung genau?
Das sollte doch eigentlich nur eine Art Hifestellung für den Assembler sein, oder?Ich bekomme aber Verschiedene Ergebnisse im übersetzten Programm, wenn Assume benutzt wird bzw. nicht benutzt wird.
Ein Beispiel
.386 stapel SEGMENT STACK USE16 db 256 dup(?) stapel ENDS code SEGMENT USE16 ASSUME cs:code;,ds:code <--- zahl dw ? text db 'adsf',36 start: mov ax, 50 mov zahl, ax mov ax, code mov ds, ax cmp zahl, 50 jne ungleich gleich: mov dx, offset text MOV AH,09h INT 21h ;Text mit DOS-Funktion ausgeben ungleich: MOV AX,4C00h INT 21h code ends end start
Wenn ds:code auskommentiert wird, wird der text ausgegeben.
Wenn ds:code jedoch nicht auskommentiert wird, wird der text nicht ausgegeben.Anscheinend denkt der Assembler, daß "zahl" im (nicht vorhandenen) daten-segment
abgelegt ist, wenn es nicht auskommentiert wird.
Da ds ja später umgeladen wird, geht "zahl" somit verloren.Ich kann mir das nicht erklären, weil "zahl" doch im codesegment auf das
cs zeigt abgelegt wird. Insofern sollte ds doch keinen Einfluß darauf haben, oder?Ich wäre sehr dankbar, wenn mir das jemand erklären könnte
-
assume sagt deinem assembler nur welche segment- register du beabsichtigst zu benutzen, um deinen code bzw. deine daten zu adressieren.
wenn also ds:code auskommentiert ist, dann weiss der assembler nur, dass du durch cs deinen code adressierst. da du nun die speicherstelle "zahl" in deinem code segment definiert hast und der assembler annimmt, dass dein code segment durch cs adressiert ist wird er die anweisung "mov zahl,ax" mit "mov cs:[zahl],ax" übersetzen.
wenn du aber ds:code nicht auskommentierst, dann denkt der assembler, dass code sowohl durch cs als auch durch ds adressiert wird. diesmal übersetzt der assembler anscheinend die zeile mit "mov DS:[zahl],ax", da er anscheinend DS zum adressieren von "variablen" beforzugt. die zeile "cmp zahl,50" wird aber nun auch mit "cmp DS:[zahl],50" übersetzt. da du aber den inhalt von DS zwischendurch verändert hast wird "DS:[zahl]" diesmal auf eine andere speicherstelle zeigen, wo die 50 gar nicht drinsteht, deshalb ist das ergebnis des vergleichs ungleich und dein programm wird die ausgabe überspringen.das ganze solltest du besser mit einem debugger noch mal überprüfen, da ich das nicht gemacht hab und nur den code interpretiert hab. sorry, zu faul heute =p
-
Danke für deine Antwort.
Ich glaub dir das auch ohne Debugger. Im Prinzip hatte ich das auch schon so vermutet.
Da "zahl" im code-segment steht, dachte ich aber, daß zur Adressierung immer das
cs Register benutzt wird, egal was bei ASSUME steht.
Das ist ja aber offensichtlich nicht so.