Можно ли использовать немедленные значения в качестве селекторов сегментов

Контекст этой проблемы заключается в том, что я использую 64-битное адресное пространство на процессоре Intel.

Я знаю, что в X64 доступны только сегментные регистры gs и fs. Все остальные базы сегментов установлены на 0.

Поскольку количество сегментных регистров ограничено, могу ли я вместо этого использовать номер непосредственно для индексации в GDT?

Нравиться

movq    0x12:Address, %rax

вместо

movq    %gs:Address, %rax

person Ajay Brahmakshatriya    schedule 27.07.2017    source источник
comment
Не с mov. Инструкции jmp и call far имеют специальную кодировку для непосредственных значений сегмента и смещения в 32-битном режиме. В 32-битном коде вы можете сделать что-то вроде jmp $0x08, $jmplabel   -  person Michael Petch    schedule 27.07.2017
comment
Кодировка в моем первом комментарии недействительна в 64-битном режиме.   -  person Michael Petch    schedule 27.07.2017
comment
Итак, в 32-битном режиме с использованием такой инструкции (jmp или call) будет ли обновление cs до нового селектора сегментов?   -  person Ajay Brahmakshatriya    schedule 27.07.2017
comment
Да, в моем примере jmp $0x08, $jmplabel установит CS на селектор сегмента 0x08, а EIP на смещение jmplabel.   -  person Michael Petch    schedule 27.07.2017
comment
@МайклПетч. Хорошо, спасибо за устранение путаницы!   -  person Ajay Brahmakshatriya    schedule 27.07.2017


Ответы (2)


Нет, это невозможно. Вы должны загрузить селектор сегмента в регистр сегмента, прежде чем сможете использовать его в операнде памяти. Кроме того, конечно, все шесть из cs, ds, es и ss все еще доступны, что не является смещениями и ограничениями сегмента, за исключением fs и gs, использующих специальный механизм.

person fuz    schedule 27.07.2017

Первый вопрос:

Как вы ожидаете, что инструкция movq 0x12:Address, %rax работает?

В 32-битном защищенном режиме ожидаемое поведение очевидно: если такая инструкция существовала, она должна работать так же, как movl %fs:Address, %eax ведет себя, когда %fs равно 0x12.

А как насчет 64-битного режима?

Моя информация взята из более старого руководства по процессорам AMD, поэтому она может быть неверна для последних процессоров.

Однако насколько я правильно понял это руководство, префиксы %fs: и %gs: НЕ используют регистры %fs и %gs в 64-битном режиме, а используют специальные регистры FS.base и GS.base.

Содержимое регистров %fs и %gs игнорируется так же, как содержимое регистра %ds игнорируется в «обычной» операции.

Если ваш вопрос:

"Какая инструкция ведет себя так же, как movq %fs:Address, %rax, если %fs содержит значение 0x12?"

Ответ прост: movq %fs:Address, %rax.

... потому что регистр %fs этой инструкцией вообще не используется!

Если ваш вопрос:

"Какая инструкция ведет себя так же, как movq %fs:Address, %rax, если FS.base содержит значение MyFsBase?"

Ответ тоже прост: movq (Address+MyFsBase), %rax

... потому что %fs:Address на самом деле означает: (Address+FS.base).

person Martin Rosenau    schedule 27.07.2017