То, что вы можете сделать в asm, ограничено возможностями оборудования.Неявный или явный размер операнда в исходном коде (суффикс или нет) не меняет машинный код, к которому он будет собираться.
Поэтому правильный вопрос, который нужно задать, заключается в том, может ли аппаратное обеспечение выполнить 32-разрядную передачу.в 64-битном режиме?Нет, не может, поэтому не существует синтаксиса исходного кода asm, который заставил бы его делать именно то, что вы пытались сделать с одной инструкцией.
Вот почему вашассемблер не примет pop %edi
или popl %edi
.Они в точности эквивалентны, потому что 32-битный регистр подразумевает размер операнда DWORD (l
). Примеры, которые вы видели для popl
или pop %edi
, относятся к 32-битному режиму, , где EDI - полный регистр вместо младшей половины RDI, и эта инструкция кодируется.
Вам нужен суффикс размера, только если он неоднозначный, mov $1, (%rdi)
.Ваш ассемблер выдаст за это ошибку, вместо того, чтобы угадать одно из ч / б / л / q.
Но push является немного особенным: push $1
по умолчанию будет 64-битным, даже если pushw $1
возможно. Сколько байтов команда push помещает в стек, если я не указал размер операнда?