Что делает инструкция 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.