какова цель инструкций поворота (rol, rcl на x86)?

<p>мне всегда было интересно, какова цель инструкций поворота, которые есть у некоторых процессоров (например, rol, rcl на x86). какое программное обеспечение использует эти инструкции? сначала я подумал, что они могут быть использованы для шифрования/вычисления хеш-кодов, но эти библиотеки обычно пишутся на c, в котором нет операторов, которые соответствуют этим инструкциям.<br> кто-нибудь нашел для них применение? почему, где они добавили в набор инструкций?</p>

<p>повороты требуются для сдвигов битов по нескольким словам. когда вы shl нижнего слова, старший бит выливается в переноску. чтобы завершить операцию, вам нужно сдвинуть старшее слово (слова), в то же время перенося перенос на младший бит. rcl - это инструкция, которая выполняет это.</p><pre> старшее слово низкое слово cf initial 0110 1001 1011 1001 1100 0010 0000 1101? shl low word 0110 1001 1011 1001 1000 0100 0001 1010 1 rcl старшее слово 1101 0011 0111 0011 1000 0100 0001 1010 1 .\_\_ ,</pre><p>rol и ror полезны для проверки значения побитовым способом, который (в конечном счете) является неразрушающим. они также могут быть использованы, чтобы шунтировать битовую маску, не внося мусорные биты.</p>

<p>коды операций сдвига поворота rol, rcl, ror, rcr) используются почти исключительно для хеширования и вычислений crc. они довольно загадочны и очень редко используются.</p><p>сдвиговые коды операций (shl, shr) используются для быстрого умножения на степени 2 или для перемещения младшего байта в старший байт большого регистра.</p><p>разница между rol и shl в том, что rol берет старший бит и катит его в младшую позицию. shl выбрасывает старший бит и заполняет позицию младшего бита нулем.</p>

<p>ror rol являются «историческими», но все же полезными во многих отношениях.</p><p>до 80386 (и кода операции bt), rol много использовался бы для проверки бита (shl не распространяется на флаг переноса) - фактически в 8088 году ror/rol сдвигался только на 1 бит за раз !!! !</p><p>также, если вы хотите сдвинуться в одну сторону, а затем в другую, не теряя биты, которые были сдвинуты из области видимости, вы бы использовали ror/rol вместо shr/shl</p>

<p>если я вас правильно понимаю, ваш вопрос таков:</p><p><em>"учитывая тот факт, что инструкции ротации выглядят очень специализированными и не генерируются компиляторами, когда они фактически используются и почему они включены в цп?"</em> </p><p>ответ двоякий:</p><ol> <li><p>процессоры не предназначены специально для выполнения программ на c. скорее, они спроектированы как машины общего назначения, предназначенные для решения широкого круга задач с использованием широкого спектра различных инструментов и языков.</p></li> <li><p>разработчики языка не обязаны использовать каждый код операции в cpu. фактически, в большинстве случаев это не так, потому что некоторые инструкции цп являются узкоспециализированными, и у разработчика языка нет острой необходимости их использовать.</p></li> </ol><p>дополнительную информацию о побитовых операторах (и как они связаны с программированием на c) можно найти здесь: <a href="http://en.wikipedia.org/wiki/bitwise\_operation">http://en.wikipedia.org/wiki/bitwise\_operation</a> </p>

<p>когда микропроцессоры создавались впервые, большинство программ были написаны на ассемблере, а не скомпилированы. большинство инструкций процессора, вероятно, не генерируются компиляторами (что является стимулом для создания risc), но часто относительно легко реализуются в аппаратном обеспечении.</p><p>многие алгоритмы в графике и криптографии используют ротацию, и их включение в процессоры позволяет писать очень быстрые алгоритмы на ассемблере.</p>