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.


Anmelden zum Antworten