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).