2017-01-21 8 views
3

мне было интересно, если это возможно, чтобы кодировать инструкции как:Возможно ли 64-битный операнд прямой памяти на x86-64?

надстройкой бараков, [адрес]

где < адрес> является полный 64-битный адрес, указывающий на 64-разрядную стоимость. NASM, похоже, просто усекает адрес и кодирует его как 32-разрядный адрес. Единственная форма 64-битная адресация (с прямым адресом), который, кажется, работает это:

мы Rax, [QWORD адрес]

, который кодируется с помощью NASM REX.W = 1 и специальные коды операций MOV с прямой адресацией. Использование REX.W с инструкцией add просто позволяет интерпретировать целевой адрес как содержащий 64-битное значение, но не позволяет специфицировать 64-разрядный адрес. Но мне любопытно, есть ли другой способ.

(Кстати, из-за этой проблемы я сейчас использую RIP-относительную адресацию).

Может ли кто-нибудь подтвердить, что прямая 64-битная форма адресации невозможна?

+0

Ссылка на набор инструкций может подтвердить, что, а не какой-то незнакомец из Интернета;) – Jester

+0

Шут, я посмотрел ссылку на инструкцию. Но несколько сложно исключить, что может быть способ, особенно потому, что я не привык его читать. В задании набора инструкций приведена опция «[REX.W + 03/r] ADD r64, r/m64», но на основе экспериментов и ваших анверов (и таблиц относительно байта MOD R/M). Я заключаю, что это означает добавление 64 -битного значения, хранящегося на 32-разрядном указанном адресе памяти (без возможности расширения адреса до 64-разрядной информации за пределами использования дополнительных инструкций). – Morty

+0

@Morty Обычный набор режимов адресации не включает режим с 64-битным расположением или абсолютным. В этом режиме адресации предусмотрены только определенные специальные инструкции. – fuz

ответ

3

Архитектура amd64 не имеет режима адресации с 64-битным расположением, за исключением некоторых особых случаев. Вместо этого используйте относительную адресацию rip, которая должна быть хорошей, если размер вашего двоичного файла меньше 2 ГБ.

+0

Как правильно сказано, там ** есть ** «mov rax, moffs64», поэтому нет необходимости в вашем обходном пути. Вы должны использовать другой регистр, чтобы проиллюстрировать вашу точку;) – Jester

+0

@Jester Да, да. – fuz

+0

Хорошо, хорошо, что подтвердили, что невозможно выполнить _addition_ (а не просто переход) с использованием прямого 64-битного адреса. – Morty