assembly - microsoft - visual studio installer
¿Los códigos de operación x86 son arbitrarios? (1)
Se implementaron versiones muy tempranas de esta arquitectura (8008,8080) usando números extremadamente pequeños de transistores / compuertas lógicas.
En ese momento, estoy seguro de que los diseñadores eligieron los códigos de operación y los formatos de instrucción de manera que fueron fáciles de descodificar (por ejemplo, el menor número de puertas). Las instrucciones tendían a ser simples y regulares en formato.
(Sé que hice esto diseñando una CPU de 16 bits en la década de 1970. Intel podría haber hecho un mejor trabajo, pero siempre tenían prisa. Mis CPU insistían en que los códigos de operación de 4 bits 0000 y 1111 no eran válidos y causaban una trampa; los datos se ejecutan por accidente en la mayoría de los casos porque los valores integrales tienden a ser todos ceros o unos en sus bits superiores).
El éxito y la competencia exigen la evolución y la incorporación de nuevas características. Hay una presión constante para inventar / agregar nuevas instrucciones que permitan a las CPU hacer las cosas más rápido y mejor: coma flotante, datos de 32 bits, más registros, operaciones SIMD, cifrado, ...
A medida que aparecieron las nuevas generaciones de procesadores, con presupuestos de transistores más grandes, sucedieron dos cosas cuando los diseñadores intentaron agregar nuevas instrucciones:
- El conjunto de instrucciones existente ya definió un grupo de patrones, y estos patrones no se pudieron cambiar. Por lo tanto, el diseño de un nuevo código de operación, formatos de instrucción y operandos, tuvo que ser calzado en los "agujeros" en el conjunto de instrucciones. Esto forzó combinaciones peculiares de bits para varias instrucciones
- La disponibilidad de más transistores significaba que la decodificación de patrones de bits complejos no era un problema, por lo que elegir combinaciones de bits extrañas y decodificarlas era sencillo.
Repita este proceso a través de una docena de generaciones de CPU hasta llegar a los tiempos modernos, con muchos miles de millones de chips de transistores. Ahora las instrucciones agregadas se vuelven más exóticas y los patrones se vuelven más complejos. Puede parecer arbitrario; no lo es, pero tampoco está bien diseñado.
Lo que hacen los chips x86 modernos con los formatos de instrucción es bastante impresionante, pero funciona.
¿Los códigos opcionales x86 son arbitrarios?
¿Hay alguna razón por la que hlt
sea 0xf4 y el nop
sea 0x90?