Register cs,ds bei x86



  • Hallo!

    Wie kann man cs setzen? Wird das automatisch mit einem jmp 0x1000:0 auf 0x1000 gesetzt?

    Und wie verhält es sich mit ds?
    Wozu ist ds nötig? Bei Labels wird ja hoffentlich automatisch die richtige Adresse gewählt?

    mov ax,myString ; <-- wirkt sich ds auf die Adresse von myString aus, sprich: wird automatisch ds:myString verwendet?
    myString db 'Hallo',0

    mov bx,8
    mov word [bx],0xFF ; <-- hier wird automatisch [ds:bx] verwendet, oder?
    mov word [myString],'X' ; <-- und hier nicht?

    Vielleicht kann mir mal jemand kurz erläutern, wann die Segmente verwendet werden, und wann nicht.



  • aSASASDASD schrieb:

    Hallo!

    Wie kann man cs setzen? Wird das automatisch mit einem jmp 0x1000:0 auf 0x1000 gesetzt?

    Ja genau.

    Und wie verhält es sich mit ds?
    Wozu ist ds nötig? Bei Labels wird ja hoffentlich automatisch die richtige Adresse gewählt?

    DS ist für viele Speicherzugriffe das Default-Segmentregister.
    Beispiel:
    mov ax,[si]
    Damit wird der Inhalt(2 Bytes) von der Speicheradresse in DS:SI nach AX geladen.

    mov ax,myString ; <-- wirkt sich ds auf die Adresse von myString aus, sprich: wird automatisch ds:myString verwendet?
    myString db 'Hallo',0

    mov bx,8
    mov word [bx],0xFF ; <-- hier wird automatisch [ds:bx] verwendet, oder?

    Ja richtig.

    mov word [myString],'X' ; <-- und hier nicht?

    Doch, auch dort wird DS verwendet.

    Vielleicht kann mir mal jemand kurz erläutern, wann die Segmente verwendet werden, und wann nicht.

    Defaultmäßig wird das DS-Segmentregister verwendet.

    Ausnahme: Wenn BP und/oder SP als Adressregister verwendet wird, dann wird SS als Segmentregister verwendet.
    Beispiel:
    mov ax,[bp]
    Damit wird der Inhalt(2 Bytes) von der Speicheradresse in SS:BP nach AX geladen.

    Sonst gibt es noch Stringbefehle bei denen ES als Zielsegment dient.
    Beispiel:
    stosw
    Damit wird der Inhalt von AX nach ES:DI geschreiben.

    Dirk



  • mov word [myString],'X' ; <-- und hier nicht?

    Ups sorry da war ich zu voreilig, wenn myString eine Adresse ist wird auch SS verwendet.

    Hier ein Überblick für die möglichen Adressierungsarten für 16 bit und 32 bit Adressen.
    (Aus der Sicht des 16 Bit-modes...anderfalls Adress- und Operand-prefixe vertauschen.)

    Format of Postbyte(Mod R/M aus Intel-Doku)
    ------------------------------------------
    MM RRR MMM
    
    MM  - Memeory addressing mode
    RRR - Register operand address
    MMM - Memoy operand address
    
    RRR Register Names
    Filds  8bit  16bit  32bit
    000    AL     AX     EAX
    001    CL     CX     ECX
    010    DL     DX     EDX
    011    Bl     BX     EBX
    100    AH     SP     ESP
    101    CH     BP     EBP
    110    DH     SI     ESI
    111    BH     DI     EDI
    
    ---
    
    16bit memory (No 32 bit memory address prefix)
    MMM   Default MM Field
    Field Sreg     00        01          10             11=MMM is reg
    000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
    001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
    010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
    011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
    100   DS       [SI]      [SI+o8]     [SI+o16]
    101   DS       [DI]      [DI+o8]     [SI+o16]
    110   SS       [o16]     [BP+o8]     [BP+o16]
    111   DS       [BX]      [BX+o8]     [BX+o16]
    Note: MMM=110,MM=0 Default Sreg is DS !!!!
    
    32bit memory (Has 67h 32 bit memory address prefix)
    MMM   Default MM Field
    Field Sreg     00        01          10             11=MMM is reg
    000   DS       [EAX]     [EAX+o8]    [EAX+o32]
    001   DS       [ECX]     [ECX+o8]    [ECX+o32]
    010   DS       [EDX]     [EDX+o8]    [EDX+o32]
    011   DS       [EBX]     [EBX+o8]    [EBX+o32]
    100   SIB      [SIB]     [SIB+o8]    [SIB+o32]
    101   SS       [o32]     [EBP+o8]    [EBP+o32]
    110   DS       [ESI]     [ESI+o8]    [ESI+o32]
    111   DS       [EDI]     [EDI+o8]    [EDI+o32]
    Note: MMM=110,MM=0 Default Sreg is DS !!!!
    
    ---
    
    SIB is (Scale/Base/Index)
    SS BBB III
    Note: SIB address calculated as:
    <sib address>=<Base>+<Index>*(2^(Scale))
    
    Fild   Default Base
    BBB    Sreg    Register   Note
    000    DS      EAX
    001    DS      ECX
    010    DS      EDX
    011    DS      EBX
    100    SS      ESP
    101    DS      o32        if MM=00 (Postbyte)
    SS      EBP        if MM<>00 (Postbyte)
    110    SS      ESI
    111    DS      EDI
    
    Fild  Index
    III   register   Note
    000   EAX
    001   ECX
    010   EDX
    011   EBX
    100              never Index SS can be 00
    101   EBP
    110   ESI
    111   EDI
    
    Fild Scale coefficient
    SS   =2^(SS)
    00   1
    01   2
    10   4
    11   8
    

    Dirk


Anmelden zum Antworten