Что делает movslq?

Мне трудно понять, что делает инструкция movslq. Google не очень полезен, и в этом списке нет такой инструкции. Здесь я прочитал это

MOVSLQ — это перемещение и расширение по знаку значения из 32-битного источника в 64-битное место назначения.

Я понимаю это так. Инструкция перемещает значение из 32-битного источника в 64-битное место назначения, но гарантирует, что значение числа со знаком в 64-битном назначении равно значению из источника, то есть в случае отрицательного числа она заполняет первые 32 бита пункт назначения единицами, иначе нулями.

Правильно ли я понимаю? Если нет, объясните, где я не прав.

ИЗМЕНИТЬ:

Это не дубликат этой темы: различие сборки cltq и movslq. Объяснений на мой вопрос нет. И вам придется прочитать весь ответ в течение 10 минут, чтобы убедиться в этом.


person ibodi    schedule 09.04.2019    source источник
comment
Это movsxd: felixcloutier.com/x86/MOVSX:MOVSXD.html и да, это расширение знака дополнения 32->64 до 2. Вы можете понять это самостоятельно, собрав его с помощью ассемблера AT&T и разобрав с помощью синтаксического дизассемблера Intel. (например, objdumpd -d -Mintel foo.o)   -  person Peter Cordes    schedule 09.04.2019
comment
Информация находится там, если вы с помощью control-f ищете movslq в различии сборки cltq и movslq, второе упоминание об этом находится в предложении объясняя, что это movsx, со ссылкой на руководство Intel. Вы правы, это не идеальный дубликат, но я хотел закрыть его, потому что есть механическое решение (собрать + разобрать), чтобы узнать мнемонику Intel для кодов операций AT&T, и больше нечего сказать об этом, поэтому такие вопросы имеют несколько низкое качество.   -  person Peter Cordes    schedule 09.04.2019
comment
И расширение знака дополнения 2 - это то, что вы можете найти отдельно, или это также документирует руководство Intel. Но, конечно, я думаю, что шагов достаточно, чтобы собрать их в ответ; вы, вероятно, не первый человек, который ищет movslq.   -  person Peter Cordes    schedule 09.04.2019


Ответы (1)


Это 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.


Связанный: Что делает cltq в сборке? имеет эквивалентность таблица мнемоники AT&T и Intel для всех инструкций по расширению знака x86 вместе с описанием. ([ER]AX в DX:AX, внутри-[ER]AX и movsx/movzx в произвольные регистры.)

различие сборки cltq и movslq имеет больше истории о том, как AMD64 перепрофилировал код операции ARPL из 16 /32-битный режим, чтобы получить 1-байтовый код операции для movsxd.

person Peter Cordes    schedule 09.04.2019