Архитектурный регистр FS отделен от внутреннего регистра базы FS.
Как всегда, при использовании переопределения сегмента просто выбирается база сегмента, связанная с этим сегментом, вместо базы DS по умолчанию или базы SS ( которые фиксируются на 0
в 64-битном режиме).
Фактическое значение в самом архитектурном регистре fs
не имеет к нему никакого отношения . Он вступает в игру только в том случае, если вам нужно mov %fs, %eax
фактически прочитать сам регистр FS, а не использовать связанные с ним внутренние «регистры» базы / предела.
Поскольку существуют способы установки внутренней FS base (например, с wrmsr
или на более поздних процессорах инструкция wrfsbase
), которые более эффективны, чем mov
до %fs
(чтобы он загружал базу и лимит из GDT или LDT ), ОС обычно оставляют архитектурные регистры FS и GS = 0, нулевой селектор.
На голом металле вы тоже можете это сделать. Не беспокойтесь о создании записи GDT с нужной вам базой и mov
с помощью селектора в %fs
или %gs
; просто установите базу непосредственно с помощью wrmsr
или wrfsbase
.
Что произойдет, если я изменю регистр fs без изменения базы fs?
Вы не можете, AFAIK , mov %reg/mem, %fs
инициирует загрузку внутренних / предельных регистров сегмента из GDT или LDT (в зависимости от значения, которое вы перемещаете).
Обратите внимание, что некоторые люди называют эти внутренние вещи "кэшем", но они не кеширует. Они гарантированно сохранят значения с момента их загрузки, поэтому они никогда не изменятся, если вы измените запись GDT без перезагрузки регистра сегмента с этим селектором.
Как влияет на эффективный расчет адреса?
То же, что и всегда база + индекс * шкала + смещение. Обратите внимание, что «эффективный адрес» - это просто смещенная часть полного адреса, не включая селектор сегмента или базу. Что такое эффективный адрес?
Адрес linear также рассчитывается как всегда: segment_base + offset
, где часть смещения - это эффективный адрес, указанный в режим адресации.
В режимах адресации по умолчанию используется база сегмента DS, если «базовый регистр» в режиме адресации не является E / RBP или E / RSP, и в этом случае это база SS. Но префиксный байт может переопределить значение по умолчанию; это то, что %fs:
говорит ассемблеру испускать.