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',0mov 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',0mov 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