Что делает инструкция movsbl?

Я искал в сети, но не смог найти четкого примера, чтобы понять, что делает эта инструкция. Так что, если кто-то может привести пример по этому поводу, это будет очень полезно для меня.

4 ответа

Решение

Перемещение со знаком расширяется от байта к длинному слову. В синтаксисе Intel мнемоника этой инструкции - MOVSX.

Компилятор A C может использовать эту инструкцию, когда переменная типа int8_t должен быть преобразован в int, что происходит автоматически при арифметических и некоторых других операциях (целочисленное продвижение).

Поскольку эта инструкция записывает все 32 (или 64) бита в регистре назначения, она позволяет избежать потерь производительности, которые могут возникнуть в результате записи только в младшие 8 (или 16) битов регистра. Подобный набор инструкций позволяет расширяться с нулевыми битами (MOVZX в синтаксисе Intel, MOVZst в синтаксисе AT&T (от размера s до размера t)).

Топ веб-хит для movsbl эта страница, и если вы ищете movsbl это говорит

MOVSBL and MOVZBL
* MOVSBL sign-extends a single byte, and copies it into a
  double-word destination
* MOVZBL expands a single byte to 32 bits with 24 leading
  zeros, and copies it into a double-word destination

Example:
%eax = 0x12345678
%edx = 0xAAAABBBB
MOVB %dh, %al         %eax = 0x123456BB
MOVSBL %dh, %eax      %eax = 0xFFFFFFBB
MOVZBL %dh, %eax      %eax = 0x000000BB

Похоже, довольно четкий пример для меня. Дополнительные примеры читайте на следующей странице.

Предполагая, что вы говорите о x86, инструкция MOVSBL расширяет байт (8 бит), представляющий число со знаком, до 32-разрядного числа со знаком. Оставшиеся 24 бита являются нулями или единицами в зависимости от знака, так что значение дополнения двух остается.

Это означает, что если у вас отрицательное число, старшие 24 бита будут равны 1 с, иначе они будут равны нулю.

Эквивалентом для чисел без знака является MOVZBL, который всегда расширяется на 0.

Предполагая, что это синтаксис сборки AT&T для IA32 (i386/x86_64), это означает MOV с расширением Sign от Byte до Long. То есть это эквивалентно MOVSX r32, r/m8 см. 3-730 Том. .

Другие вопросы по тегам