В синтаксисе NASM/Intel mov r64, 0x...
выбирает a MOV encoding на основе константы. Есть четыре варианта с немедленными операндами:
- 5 байт
mov r32, imm32
. (zero-extended to fill the 64-bit register like always). AT & T: mov
/movl
- 6 байт
mov r/m32, imm32
. только полезно для назначения памяти. AT & T: mov
/movl
- 7 байт
mov r/m64, sign-extended-imm32
. Может хранить 8 байтов в памяти или установить 64-разрядный регистр на отрицательное значение. AT & T: mov
/movq
- 10 байт
mov r64, imm64
. (Это версия REX.W = 1 одного и того же кода операции, как mov r32, imm32
) AT & T: movabs
(отсчеты байт только для назначения регистра или режимов адресации, которые не нуждаются байта SIB или disp8/disp32:. только опкод + ModR/М + imm32)
в газе с AT & T синтаксис
movabsq
означает, что машины кодировка кодировки будет содержать 64-битное значение: либо постоянную константу, либо абсолютный адрес памяти. Без movabsq
, он не может.
Некоторые из них упоминаются в этом what's new in x86-64 guide с использованием синтаксиса AT & T.
movq
всегда является 7-байтовой формой, поэтому не используйте mov $1, %rax
, если вы не хотите использовать более длинную инструкцию для выравнивания (вместо заполнения с помощью NOP позже). Используйте mov $1, %eax
, чтобы получить 5-байтовую форму.
Интересный эксперимент: movq $0xFFFFFFFF, %rax
, вероятно, не encodeable, потому что это не представимо с знаком с увеличенным 32-битовый непосредственный а, и нужно либо imm64 кодирование или кодирование в %eax
назначения.
movabs
с непосредственным источником всегда является формой imm64. (movabs
также может быть кодировкой MOV с 64-битным абсолютным адресом и RAX в качестве источника или dest: REX.W + A3
MOV moffs64, RAX
).
Некоторые Intel-синтаксис монтажники (но не GAS) оптимизирует 32-битные константы 5-бытье mov r32, imm32
(NASM делает это), в то время как другие (как Yasm) будет использовать 7-байт mov r/m64, sign-extended-imm32
. Оба они выбирают кодировку imm64 только для больших констант, без необходимости использовать специальную мнемонику.
Я не понимаю, как я могу переместить непосредственное значение 64-разрядной памяти.
Это отдельный вопрос, и ответ таков: вы не можете. Значение insn ref manual entry for MOV делает это ясным: единственная форма, которая имеет немедленный операнд imm64, имеет только регистр, а не r/m64.
Если ваше значение вставляется в 32-битный расширенный знак, movq $0x123456, 32(%rdi)
сделает 8-байтовый магазин в память. Ограничение в том, что это только imm32.
Вы должны перенести его в регистр, а затем в память. Вот и все. –