операндом LIDT является смещение / абсолютный адрес - PullRequest
0 голосов
/ 26 мая 2011

Я наткнулся на утверждение в руководстве для разработчиков ПО Intel: «Для LGDT, LIDT, LLDT, LTR, SGDT, SIDT, SLDT, STR квалификация выхода получает значение поля смещения инструкции, которое расширяется до64 бита, если необходимо (32 бита на процессорах, которые не поддерживают архитектуру Intel 64). Если инструкция не имеет смещения (например, имеет операнд регистра), в квалификации выхода сохраняется ноль. "

Теперьесли у меня есть инструкция LIDT 0xf290, то является ли "0xf290" смещением?Я думаю, что ответ - да.

Итак, моя путаница в том, что все представляет собой смещение?У меня сложилось впечатление, что смещение - это то, что рассчитывается относительно текущего значения eip.Например,jmp xxx (В межсегментных скачках это будет смещение. Но для межсегментных скачков это должен быть абсолютный адрес.) Если это так, то почему LIDT загружает относительный адрес?

1 Ответ

1 голос
/ 27 мая 2011

A смещение - это просто смещение от некоторого начала координат, которое может быть Base+Index*Scale или 0. Другой операнд x86, который может содержать большие значения, немедленный , которыйполезно для таких вещей, как добавление констант (например, ADD $42, %eax).

Между прочим, кажется, что для относительных переходов используется поле немедленное , возможно, потому что они изменяют EIP на постоянную.

...