Razones de alto nivel
Cuando lo piensa, un microprocesador hace una cosa asombrosa: le permite tomar una máquina (como una lavadora o un elevador) y reemplazar una gran cantidad de mecanismos o circuitos diseñados a medida con un silicio barato y producido en masa. chip. Se ahorra mucho dinero en piezas y mucho tiempo en diseño.
¿Pero espera un chip estándar que reemplaza innumerables diseños personalizados ? No puede haber un solo microprocesador perfecto que sea perfecto para cada aplicación. Algunas aplicaciones necesitan minimizar el uso de energía pero no necesitan ser rápidas; otros deben ser rápidos pero no deben ser fáciles de programar, otros deben ser de bajo costo, etc.
Por lo tanto, tenemos muchos "sabores" diferentes de microprocesador, cada uno con sus propias fortalezas y debilidades. Es deseable que todos usen un conjunto de instrucciones compatible, ya que esto permite la reutilización del código y facilita la búsqueda de personas con las habilidades adecuadas. Sin embargo, el conjunto de instrucciones hace afectar el costo, la complejidad, la velocidad, facilidad de uso y las limitaciones físicas del procesador, y por eso tenemos un compromiso: hay unos "principales" conjuntos de instrucciones (y muchos otros menores), y Dentro de cada conjunto de instrucciones hay muchos procesadores con diferentes características.
Ah, y a medida que la tecnología cambia, todas estas compensaciones cambian, por lo que los conjuntos de instrucciones evolucionan, surgen otros nuevos y los viejos mueren. Incluso si hubiera un "mejor" conjunto de instrucciones de hoy, podría no serlo en 20 años.
Detalles de hardware
Probablemente, la decisión de diseño más importante en un conjunto de instrucciones es el tamaño de la palabra , es decir, qué tan grande puede manipular el procesador "naturalmente". Los procesadores de 8 bits manejan números del 0 al 255, mientras que los procesadores de 32 bits manejan números del 0 al 4,294,967,295. El código diseñado para uno necesita ser completamente repensado para otro.
No se trata solo de traducir las instrucciones de un conjunto de instrucciones a otro. Un enfoque completamente diferente puede ser preferible en un conjunto de instrucciones diferente. Por ejemplo, en un procesador de 8 bits, una tabla de búsqueda puede ser ideal, mientras que en un procesador de 32 bits una operación aritmética sería mejor para el mismo propósito.
Existen otras diferencias importantes entre los conjuntos de instrucciones. La mayoría de las instrucciones se dividen en cuatro categorías:
- Computación (aritmética y lógica)
- Flujo de control
- Transferencia de datos
- Configuración del procesador
Los procesadores difieren en el tipo de cálculos que pueden realizar, así como en la forma en que abordan el flujo de control, la transferencia de datos y la configuración del procesador.
Por ejemplo, algunos procesadores AVR no pueden multiplicarse ni dividirse; mientras que todos los procesadores x86 pueden. Como puede imaginar, eliminar los circuitos necesarios para tareas como la multiplicación y la división puede hacer que un procesador sea más simple y económico; estas operaciones aún pueden realizarse utilizando rutinas de software si son necesarias.
x86 permite instrucciones aritméticas para cargar sus operandos de la memoria y / o guardar sus resultados en la memoria; ARM es una arquitectura de almacén de carga y, por lo tanto, solo tiene unas pocas instrucciones dedicadas para acceder a la memoria. Mientras tanto, x86 tiene instrucciones dedicadas de ramificación condicional, mientras que ARM permite que prácticamente todas las instrucciones se ejecuten condicionalmente. Además, ARM permite realizar cambios de bits como parte de la mayoría de las instrucciones aritméticas. Estas diferencias conducen a diferentes características de rendimiento, diferencias en el diseño interno y el costo de los chips, y diferencias en las técnicas de programación a nivel de lenguaje ensamblador.
Conclusión
La razón por la que es imposible tener un lenguaje ensamblador universal es que, para convertir correctamente el código ensamblador de un conjunto de instrucciones a otro, uno debe diseñar el código nuevamente, algo que las computadoras aún no pueden hacer.