Первый вопрос:
Как вы ожидаете, что инструкция 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
mov
. Инструкцииjmp
иcall
far имеют специальную кодировку для непосредственных значений сегмента и смещения в 32-битном режиме. В 32-битном коде вы можете сделать что-то вродеjmp $0x08, $jmplabel
- person Michael Petch   schedule 27.07.2017jmp $0x08, $jmplabel
установит CS на селектор сегмента 0x08, а EIP на смещениеjmplabel
. - person Michael Petch   schedule 27.07.2017