Какова цель инструкций поворота (ROL, RCL на x86)? - PullRequest
29 голосов
/ 12 февраля 2011

Мне всегда было интересно, для чего нужны инструкции поворота, которые есть у некоторых процессоров (например, ROL, RCL на x86).Какое программное обеспечение использует эти инструкции?Сначала я подумал, что они могут быть использованы для шифрования / вычисления хеш-кодов, но эти библиотеки обычно пишутся на C, в котором нет операторов, которые соответствуют этим инструкциям.Почему, где они добавили в набор инструкций?

Ответы [ 5 ]

24 голосов
/ 12 февраля 2011

Вращения требуются для сдвигов битов по нескольким словам.Когда вы SHL младшее слово, старший бит выливается в перенос.Чтобы завершить операцию, вам нужно сдвинуть старшее слово (слова), в то же время перенося перенос в бит младшего разряда.RCL - это инструкция, которая выполняет это.

                      High word             Low word         CF
Initial          0110 1001 1011 1001   1100 0010 0000 1101    ?
SHL low word     0110 1001 1011 1001   1000 0100 0001 1010    1
RCL high word    1101 0011 0111 0011   1000 0100 0001 1010    1 

ROL и ROR полезны для побитовой проверки значения способом, который (в конечном счете) является неразрушающим.Их также можно использовать для шунтирования битовой маски без добавления мусорных битов.

16 голосов
/ 12 февраля 2011

Операционные коды rotate shift ROL, RCL, ROR, RCR) используются почти исключительно для хеширования и вычислений CRC. Они довольно загадочны и очень редко используются.

Операционные коды сдвига (SHL, SHR) используются для быстрого умножения на степени 2 или для перемещения младшего байта в старший байт большого регистра.

Разница между ROL и SHL в том, что ROL берет старший бит и сворачивает его в младшую позицию. SHL выбрасывает старший бит и заполняет позицию младшего бита нулями.

8 голосов
/ 12 февраля 2011

ROR ROL являются «историческими», но все же полезными во многих отношениях.

До 80386 (и кода операции BT), ROL много использовался бы для тестирования немного (SHL не распространяется нафлаг переноса) - фактически в 8088 году ROR / ROL будут смещаться только на 1 бит за раз !!!!

Также, если вы хотите смещаться в одну сторону, а затем в другую, не теряя биты, которые имеютбыл перемещен из области видимости, вы бы использовали ROR / ROL вместо SHR / SHL

3 голосов
/ 12 февраля 2011

Если я вас правильно понял, ваш вопрос такой:

«Учитывая тот факт, что инструкции ротации кажутся очень специальными и не генерируются компиляторами, когда они фактически используются и почему они включены в ЦП?».

Ответ двоякий:

  1. ЦП не предназначены специально для выполнения программ на Си. Скорее, они сконструированы как машины общего назначения, предназначенные для решения широкого спектра задач с использованием широкого спектра различных инструментов и языков.

  2. Разработчики языка не обязаны использовать каждый код операции в CPU. Фактически, в большинстве случаев это не так, потому что некоторые инструкции ЦП являются высокоспециализированными, и у разработчика языка нет острой необходимости их использовать.

Более подробную информацию о побитовых операторах (и как они связаны с программированием на C) можно найти здесь: http://en.wikipedia.org/wiki/Bitwise_operation

1 голос
/ 12 февраля 2011

Назад, когда микропроцессоры были впервые созданы, большинство программ были написаны на ассемблере, а не скомпилированы.Большинство инструкций процессора, вероятно, не генерируются компиляторами (что является стимулом для создания RISC), но часто относительно легко реализуются в аппаратном обеспечении.

Многие алгоритмы в графике и криптографии используют ротацию и их включение вПроцессоры позволяют писать очень быстрые алгоритмы на ассемблере.

...