Это movsxd
: https://www.felixcloutier.com/x86/MOVSX:MOVSXD.html.
Вы можете сами понять это, собрав его с помощью ассемблера AT & T и разобрав с помощью синтаксического дизассемблера Intel.(например, objdumpd -d -Mintel foo.o
)
И да, он выполняет 32-> 64-битное 2 расширение знака дополнения , расширяющееся путем копирования знакового бита источникако всем новым старшим битам.(т. е. dst[63:32] = src[31]
и dst[31:0] = src[31:0]
.)
Интересный факт: его можно использовать без префикса REX.W в качестве просто 32-битной копии, которая архитектурно эквивалентна mov
, но нет никакого преимущества в этом.Или даже с префиксом размера операнда в качестве 16-битной копии, но опять же, это совершенно бессмысленно, используйте mov
.
Related: Что делает cltq в сборке? содержит таблицу эквивалентности для мнемоники AT & T и Intel для всех инструкций по расширению знака x86, а также описание.([ER] AX в DX: AX, в пределах - [ER] AX и movsx / movzx в произвольные регистры.)
сборка cltq и разница movslq имеет больше истории о том, как AMD64 переназначилкод операции ARPL из 16/32-битного режима для получения 1-байтового кода операции для movsxd
.