lea - x86 assembly
¿Cuál es el propósito de las instrucciones de rotación(ROL, RCL en x86)? (5)
Cuando se crearon por primera vez los microprocesadores, la mayoría de los programas se escribieron en ensamblaje, no compilados. La mayoría de las instrucciones de la CPU probablemente no las emitan los compiladores (que es el impulso para crear RISC), pero a menudo son relativamente fáciles de implementar en el hardware.
Muchos algoritmos en gráficos y criptografía utilizan la rotación, y su inclusión en las CPU hace posible escribir algoritmos muy rápidos en el ensamblaje.
Siempre me he preguntado cuál es el propósito de las instrucciones de rotación que tienen algunas CPU (ROL, RCL en x86, por ejemplo). ¿Qué tipo de software hace uso de estas instrucciones? Primero pensé que se podrían usar para cifrar / calcular códigos hash, pero estas bibliotecas se escriben generalmente en C, que no tiene operadores que se correspondan con estas instrucciones.
¿Alguien ha encontrado un uso para ellos? ¿Por qué donde se agregaron a las instrucciones establecidas?
Los códigos de operación de cambio de rotación ROL, RCL, ROR, RCR) se usan casi exclusivamente para cálculos hash y CRC. Son bastante arcanos y muy raramente usados.
Los códigos de operación de desplazamiento (SHL, SHR) se usan para la multiplicación rápida por potencias de 2, o para mover un byte bajo a un byte alto de un registro grande.
La diferencia entre ROL y SHL es que ROL toma el bit alto y lo desplaza a la posición de bit bajo. SHL arroja el bit alto y llena la posición de bit bajo con cero.
ROR ROL son "históricos" pero aún útiles de varias maneras.
Antes del 80386 (y del código de operación BT), ROL se usaría mucho para probar un poco (SHL no se propaga a la bandera de acarreo) - ¡en realidad en 8088, ROR / ROL solo cambiaría en 1 bit a la vez! !
Además, si desea cambiar de una forma y luego de otra manera sin perder los bits que se han desplazado fuera del alcance, usaría ROR / ROL en lugar de SHR / SHL
Se requieren rotaciones para desplazamientos de bits a través de múltiples palabras. Cuando SHL la palabra más baja, el bit de orden superior se derrama en el acarreo. Para completar la operación, necesita desplazar la (s) palabra (s) más alta (s) mientras lleva el acarreo al bit de orden inferior. RCL es la instrucción que logra esto.
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 y ROR son útiles para examinar un valor bit por bit de una manera que es (en última instancia) no destructiva. También se pueden usar para desviar una máscara de bits sin traer fragmentos de basura.
Si te entiendo correctamente, tu pregunta es esta:
"Dado el hecho de que las instrucciones de rotación parecen ser de propósito muy especial y no emitidas por los compiladores, ¿cuándo se utilizan realmente y por qué se incluyen en las CPU?".
La respuesta es doble:
Las CPU no están diseñadas específicamente para ejecutar programas C. Por el contrario, están diseñadas como máquinas de propósito general, destinadas a resolver una amplia gama de problemas utilizando una amplia variedad de diferentes herramientas e idiomas.
Los diseñadores de un idioma no están obligados a utilizar todos los códigos de operación en la CPU. De hecho, la mayoría de las veces, no lo hacen, porque algunas instrucciones de la CPU son altamente especializadas, y el diseñador del lenguaje no tiene necesidad urgente de usarlas.
Puede encontrar más información sobre los operadores bit a bit (y cómo se relacionan con la programación C) aquí: http://en.wikipedia.org/wiki/Bitwise_operation