Я пишу 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-битной адресацией смещения.
Только что нашел ответ в 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-битном режиме только для обращения к указателю на инструкцию.
Других решений пока нет …