¿cuál de las siguientes tomará un mínimo de ciclos de reloj?

0

¿Cuál de los siguientes cálculos tomará el mínimo de ciclos de reloj, si se implementa en el microcontrolador 8051? La siguiente declaración de variabe está en c-code:

unsigned int a,b;

A) b = a * a

B) b = a * 3

C) b = a / 3

D) b = a / 4

Esta pregunta se hizo en el examen de Reclutamiento ISRO 2014. ans dado es la opción D ¿puede explicar cómo resolver esto y por qué la opción es correcta?

    
pregunta aparna

2 respuestas

1

Una CPU simple como 8051 sabe cómo hacer sumas, restas, los cambios de bit a la izquierda a la izquierda y los cambios de bit a la derecha. A veces, la CPU sabe cómo hacer la multiplicación y la división (este es el caso de 8051), pero estas operaciones siempre requieren un mayor número de ciclos para completar.

Entonces, cuando necesita multiplicar un número por una potencia de dos, es mejor que desplace sus bits hacia la izquierda, y cuando necesite dividirlo por una potencia de dos, desplace sus bits hacia la derecha. Esto es lo mismo que lo que haces, mentalmente, cuando usas decimales, para multiplicar un número por 10 o 100 o por cualquier potencia de 10: simplemente agrega el número requerido de ceros a la derecha.

Ahora, para la diversión, eche un vistazo al manual de usuario 8051 y nosotros ' Veré esto en detalle:

  • El tiempo de las operaciones ADD / ADDC (adición sin / con carry) es 1 ciclo.
  • El tiempo para los cambios a la izquierda / derecha (en realidad, girar un bit a la izquierda / derecha con carry: RLC o RRC) es de 1 ciclo.
  • Los tiempos de MUL y DIV son cada 4 ciclos.

¿Cómo implementaría cada una de las operaciones descritas en el ejercicio?

  • A) a * a: tienes que usar MUL, no tienes opción - > 4 ciclos
  • B) a * 3: puedes hacerlo con dos adiciones: a + a + a - > 2 ciclos
  • C) a / 3: tienes que usar DIV - > 4 ciclos
  • D) a / 4: puede usar RRC dos veces - > 2 ciclos

Pero antes de usar RRC, es mejor que desmarque el indicador de acarreo o puede terminar con resultados incorrectos. Entonces el código para D es en realidad:

CLR C
RRC
CLR C
RRC

Ahora, esto es 4 ciclos.

Whaaaaat ??? ¡La operación B) ahora en realidad toma menos ciclos! He revisado tres veces esto, pero no soy un experto de 8051, por lo que puedo estar equivocado; pero la respuesta D), aunque claramente se destaca como la más rápida a primera vista ("es solo un pequeño cambio"), en realidad no es la correcta , desde mi punto de vista.

Conclusión

Si no pasó el examen solo por esta pregunta, puede demandar a ISRO. La respuesta oficial es, en el mejor de los casos, litigiosa. (Y en el peor de los casos, toda la pregunta es una tontería, porque depende completamente de cómo el compilador optimiza las cosas y el contexto en el que se usan estas declaraciones).

    
respondido por el dim
6

La división de un entero por una potencia de 2 es un desplazamiento hacia la derecha, que en muchas arquitecturas es una sola operación. Del mismo modo, la multiplicación por una potencia de 2 es un desplazamiento a la izquierda.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas