Могу ли я добавить 64-битные константы в 64-битные регистры?

На моей 64-битной машине Intel работает следующий код:

mov rdi, 1 << 40
add r10, rdi

и этот вполне эквивалентный вид выдает предупреждение и не работает:

add r10, 1 << 40

Должен ли я просто придерживаться номера 1 или я что-то упускаю? Такое поведение кажется неправильным.

Предупреждение, выдаваемое кодом № 2:

warning: signed dword immediate exceeds bounds

person user1864035    schedule 16.11.2013    source источник
comment
Связанный: Как отправить 64-битный int в NASM?: если imm32 с расширенным знаком не будет работать, обычно лучше всего mov записать константу в регистр, как и для инструкций ALU, таких как add.   -  person Peter Cordes    schedule 01.03.2018
comment
Также связано с mov r64, imm64 по сравнению с загрузкой из памяти.   -  person Peter Cordes    schedule 02.03.2018
comment
x86_64 Невозможно добавить 64-битное значение в rax, несоответствие операндов при "добавить" - это версия GAS; гораздо менее полезное сообщение об ошибке, но вместо предупреждения и кодирования неправильного значения выдает ошибку.   -  person Peter Cordes    schedule 10.10.2020
comment
Если значение находится в памяти, вы можете просто добавить 32-битное дополнение к старшей части: add dword ptr [var + 4], (1 << 40) >> 32   -  person phuclv    schedule 10.10.2020


Ответы (1)


Существует код операции для mov r/m64, imm64, но нет кода операции для add r/m64, imm64 в наборе инструкций x86-64. Другими словами: вы не можете использовать 64-битный непосредственный операнд для add, но вы можете для mov (есть много инструкций, которые не имеют варианта imm64; вы можете проверить Справочник по набору инструкций в Руководстве разработчика программного обеспечения Intel, чтобы проверить, какой инструкции имеют такой вариант, а какие нет).

person Griwes    schedule 16.11.2013
comment
На самом деле mov - это единственная инструкция, которая принимает imm64. См. ввод вручную insn set ref Intel для mov. (Существует также специальная форма moffs только для AL/AX/EAX/RAX, которая не использует обычный режим адресации и допускает 64-битный абсолютный адрес). Но mov r64, imm64 работает с любым рег. - person Peter Cordes; 01.03.2018