Как говорит Гарольд, размер операнда по умолчанию не закодирован в инструкции, а зависит от текущего режима процессора.
В режиме реального и 16-разрядного защищенного режима размер операнда по умолчанию составляет 16 бит, поэтому 83 E4 F0
декодирует до and $-16, %sp
.
В 32-битном режиме размер операнда по умолчанию равен 32-битным, то есть and $-16, %esp
.
В режиме x64 большинство инструкций снова по умолчанию используют размер 32-разрядных операндов (кроме ветвей и те, которые косвенно используют стек, например, нажатия, всплывающие окна, вызовы и возврат), поэтому он снова декодирует до and $-16, %esp
.
Можно переопределить размер операнда по умолчанию с помощью префиксов. Например, префикс 66h переключается между размером 32-битного и 16-разрядного операндов, поэтому 66 83 E4 F0
декодирует до and $-16, %esp
в 16-разрядном режиме и до and $-16, %sp
в 32-разрядном или 64-битном режиме. Чтобы получить размер 64-разрядного операнда, вам нужно использовать REX prefix с бит-бит, поэтому 48 83 E4 F0
декодирует до and $-16, %rsp
(но только в 64-битном режиме!).
Это зависит. Если в реальном режиме или если размер операнда по умолчанию для текущего сегмента/селектора установлен на 16 бит, он будет выполнен как 'и sp, -16'. «Обычно» это будет 32-битная версия. – harold