Существует три основных сдвига:
- Логический сдвиг влево: полностью игнорирует знаковый бит.
- Логический сдвиг вправо: очищает бит знака, если сдвиг> 0.
- Арифметическое смещение влево: то же, что и логическое смещение влево.
- Арифметическое смещение вправо: сохраняет старший бит.
У Intel есть и sal
, и shl
, но они отображаются на одно и то жеОперационный код и большинство других архитектур, по-видимому, имеют только три мнемоники.
Вы можете перестроить сетку с точки зрения сохранения знака, а не:
- Логическое + арифметическое смещение влево: без сохранения знака.
- Логический сдвиг вправо: без сохранения знака.
- Арифметический сдвиг вправо: сохранение знака.
Но это приводит кновая возможность, сдвиг влево, который является сохраняющим знак.Это будет вести себя как сохранение знакового бита, но смещение остальных как обычно.
И теперь у меня есть пара вопросов:
- Это any Реальное использование?
- Реализует ли это какая-либо архитектура?
Редактировать: Чтобы пояснить, что я имею в виду под "сохранением знака",для примера сдвига влево на 1 и ширины бита 8:
Not sign-preserving:
S A B C D E F G
/ / / / / / /
A B C D E F G 0
Sign-preserving:
S A B C D E F G
| / / / / / /
S B C D E F G 0
Надеюсь, это поможет!
Сноска 1: Интересный факт:x86 имеет второй недокументированный код операции для сдвига влево, например, d0 /4
и d0 /6
оба сдвига влево на 1 байт. Sandpile даже заявляет , что один из них - SHL, а другой - SAL, но в текущих руководствах Intel x86 документируется только кодировка /4
как для SAL, так и для SHL.
Неясно, был ли на самом деле оригинальный 8086предназначен для использования отдельных кодов операций для двух имен для одной и той же операции, или если код операции псевдонима всегда был недокументирован.Какова бы ни была история, modern x86 больше не документирует отдельные коды операций.(8 команд разделяют один и тот же начальный байт с полем /r
, различая их: ROL / ROR, RCL / RCR, SHL / SHR и SAL / SAR. Вставка некоторых других команд без сдвига в кодировку /6
будет стоитьтранзисторы и их неисправность, вероятно, также стоили бы больше транзисторов, поэтому имеет смысл, что оригинальный 8086 был разработан с избыточной кодировкой для сдвига влево, единственный вопрос - если / как это было задокументировано исторически.)
Но это совершенно не соответствует реальному вопросу: SAL для x86 составляет , а не сдвиг, сохраняющий знаковые биты.