Указатели C ++ в 64-битных инструкциях

Я пишу JIT-компилятор (только 64-битный, Windows). Мне нужно получить доступ к переменным программы C ++, по ссылке (указатель).

Пример: добавление 32-битного целого числа из памяти в 32-битный регистр, используя эту инструкцию:

opcode "03 /r" : ADD r32, m32. (valid in 64bit mode)

к сожалению, это требует 32-битного смещения, но у меня (только?) есть 64-битный указатель на переменную c ++.

Мой вопрос: есть ли способ получить 32-битное смещение из 64-битного указателя C ++?

Или, если нет, в более общем смысле, как бы я обратился к переменным c ++?

Я также попытался переместить значение указателя в rax и использовать косвенный адрес [rax]. Что, похоже, тоже не работает.

Я посмотрел на некоторую разборку (лязг), и он, кажется, использует RIP (относительный указатель инструкций), такой как

mov dword ptr [rip + test], 2358

Что кажется странным, так как рип меняется в каждой инструкции (насколько я знаю).

Любые указатели в правильном направлении будут с благодарностью.

Изменить: Косвенный адрес через [rax], работает сейчас! У меня была ошибка в C ++. Все еще не везет с 32-битной адресацией смещения.

1

Решение

Только что нашел ответ в Intel Developer Manual vol. 1 стр. 70:

«Как правило, смещения и немедленные значения в 64-битном режиме не расширяются до 64 бит. Они по-прежнему ограничены 32 битами и расширяются до знака во время вычислений эффективного адреса. Однако в 64-битном режиме поддерживается 64-битная поддержка смещение и непосредственные формы инструкции MOV. «

А в Справочном руководстве Intel по набору инструкций стр. 42:

«В 64-битном режиме кодирование ModR / M Disp32 (32-битное смещение) переопределяется как RIP + Disp32, а не только смещение. См. Таблицу 2-7».

Таким образом, disp32 может использоваться в 64-битном режиме только для обращения к указателю на инструкцию.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]