для описания сегмента (указания номера дескриптора и его расположения). хотя можно там просто какоето левое число хранить, что накладывает ограниченей на их использование
CS, DS, ES, SS меняться по-хорошему не должны: с их помощью, собсно, программа и работает в плоском адресном пространстве. FS меняться тоже не должен -- ссылается на локальную память потока. Остаётся свободным только GS, насколько знаю. Но вообще сегментные регистры фактически бесполезны.
И зачем это нужно? Что значит с их помощью? Вот например в одной статье на этом сайте написано: И где-то ещё я что-то подобное слышал. Хотелось бы понять, что это значит.
Zmiy Всё это значит, что сегментные регистры никуда не испарились и свои функции выполняют, но программисту использовать их явным образом нужды нет: их содержимое установлено системой, а менять их в ходе работы никакой нужды нет. Это не 16-разрядная адресация, когда для получения доступа к памяти, превышающей по объёму 64 килобайта, программисту приходилось менять содержимое сегментных регистров. Исключением -- как раз в сУрьезных программах -- является регистр FS, поскольку таким программам может потребоваться доступ к локальной памяти потока, которая через этот регистр и адресуется. Но на асме настолько сУрьезные программы обычно не пишутся, а в случае ЯВУ обо всём позаботится компилятор. Ну а вообще Pavia правильный совет дал, и я могу разве что присоединиться к нему да дополнить: следует хорошо понять, как процессор вообще эти самые сегментные регистры использует и в реальном, и в защищённом режимах.
Ребята FS никогда не указывал на локальную память потока. Базовый адрес сегмента описующего регистром FS указывает на структуру TEB (TIB). Локальная память потока это немножко из другой оперы.
А что в TEB находится? Не информация ли, уникальная для данного потока, а не процесса целиком? Хотя формально я действительно неправ: FS не указывает прямо на локальную память потока.
SII Хорошо спросил, что тут скажешь.. Код (Text): TEB struct Tib NT_TIB <> ;00h EnvironmentPointer PVOID ? ;1Ch Cid CLIENT_ID <> ;20h RpcHandle PVOID ? ;28h [ActiveRpcInfo] ThreadLocalStorage PVOID ? ;2Ch Peb PPEB ? ;30h LastErrorValue ULONG ? ;34h CountOfOwnedCriticalSections ULONG ? ;38h CsrClientThread PVOID ? ;3Ch Win32ThreadInfo_ PVOID ? ;40h [struct _W32THREAD* Win32ThreadInfo] Win32ClientInfo_ ULONG 1Fh DUP (?) ;44h WOW32Reserved PVOID ? ;C0h CurrentLocale ULONG ? ;C4h [LCID CurrentLocale] FpSoftwareStatusRegister ULONG ? ;C8h SystemReserved1 PVOID 36h DUP (?) ;CCh ExceptionCode LONG ? ;1A4h ActivationContextStack ACTIVATION_CONTEXT_STACK <> ;1A8h SpareBytes1 UCHAR 18h dup (?) ;1BCh GdiTebBatch GDI_TEB_BATCH <> ;1D4h gdiRgn ULONG ? ;6A8h gdiPen ULONG ? ;6ACh gdiBrush ULONG ? ;6B0h RealClientId CLIENT_ID <> ;6B4h GdiCachedProcessHandle PVOID ? ;6BCh GdiClientPID ULONG ? ;6C0h GdiClientTID ULONG ? ;6C4h GdiThreadLocaleInfo PVOID ? ;6C8h Win32ClientInfo PVOID 3Eh dup (?) ;6CCh glDispatchTable PVOID 0E9h dup (?) ;7C4h glReserved1 ULONG 1Dh dup (?) ;B68h glReserved2 PVOID ? ;BDCh glSectionInfo PVOID ? ;BE0h glSection PVOID ? ;BE4h glTable PVOID ? ;BE8h glCurrentRC PVOID ? ;BECh glContext PVOID ? ;BF0h LastStatusValue NTSTATUS ? ;BF4h StaticUnicodeString UNICODE_STRING <> ;BF8h StaticUnicodeBuffer WCHAR 106h DUP (?) ;C00h DeallocationStack PVOID ? ;E0Ch TlsSlots PVOID 40h DUP (?) ;E10h TlsLinks LIST_ENTRY <> ;F10h Vdm PVOID ? ;F18h ReservedForNtRpc PVOID ? ;F1Ch DbgSsReserved PVOID 2h DUP (?) ;F20h HardErrorDisabled ULONG ? ;F28h Instrumentation PVOID 10h DUP (?) ;F2Ch WinSockData PVOID ? ;F6Ch GdiBatchCount ULONG ? ;F70h InDbgPrint BOOLEAN ? ;F74h FreeStackOnTermination BOOLEAN ? ;F75h HasFiberData BOOLEAN ? ;F76h IdealProcessor UCHAR ? ;F77h Spare3 ULONG ? ;F78h ReservedForPerf ULONG ? ;F7Ch ReservedForOle PVOID ? ;F80h WaitingOnLoaderLock ULONG ? ;F84h Wx86Thread Wx86ThreadState <> ;F88h TlsExpansionSlots PVOID ? ;F94h ImpersonationLocale ULONG ? ;F98h IsImpersonating ULONG ? ;F9Ch NlsCache PVOID ? ;FA0h pShimData PVOID ? ;FA4h HeapVirtualAffinity ULONG ? ;FA8h CurrentTransactionHandle PVOID ? ;FACh ActiveFrame PTEB_ACTIVE_FRAME <>;FB0h FlsSlots PVOID ? ;FB4h TEB ends
Чтобы хранить селекторы=) читай интел маны. ну а расписанное выше - это обычное использование cs,ds,ss,es,fs..
Clerk Спасибо за содержательный ответ, точного описания у меня под рукой нет, а искать лень Как видим, в TEB есть поле ThreadLocalStorage, т.е. указатель на локальную память потока. Собсно, это я и имел в виду, но выразился, конечно, некорректно. Правильней было бы сказать, что FS позволяет обращаться к структуре данных, содержащей инфу для данного потока, в т.ч. и указатель на его локальную память.