Синтаксис NASM push DWORD 0xFFFF
- это push немедленного dword, расширенного до qword, при сборке в 64-битном режиме.
ИДК, почему NASM и YASM принимают это без предупреждения; Я бы сказал, что они не должны, потому что это вводит в заблуждение, как вы обнаружили.
Должен работать только push strict dword 1
, чтобы переопределить непосредственное кодирование (а не размер операнда инструкции). Примечание ключевое слово strict
, которое используется для переопределения нормального выбора кратчайшего кодирования (и в этом случае принудительного использования imm32, даже если число может быть закодировано в imm8). push dword 1
не не запрещает оптимизацию до push imm8
, он только устанавливает операнд на dword
. За исключением того, что это не так, он устанавливает его на qword в 64-битном режиме. Супер запутанный и возможно сломанный.
Единственными допустимыми размерами операндов для push
в 64-битном режиме являются 64 и 16.
Сколько байтов команда push помещает в стек, если я не указываю размер операнда? . 32-битный push
не кодируется в 64-битном режиме.
Это относится к толчкам с памятью и операндам регистров, а не только к немедленным. Именно поэтому push dword [mem]
не кодируется; в этом случае NASM рассматривает его как фактически требующий операнд памяти dword.
QWORD push-немедленный может использовать 8-битный или 32-битный немедленный, оба знака расширены до 64. Ширина непосредственного отделяется от размера операнда (ширина хранилища в памяти и количество вычитается из RSP). Снова, посмотрите на этот связанный вопрос.