Programación de microprogramación vs. lenguaje de máquina

9

Estoy un poco confundido entre el nivel de microprogramación y el nivel de lenguaje de máquina. Por ejemplo:

  1. ¿Dónde residen ambos tipos de programas mientras se ejecutan?
  2. ¿Tiene alguna asignación 1: 1 a instrucciones true-op en lenguaje ensamblador?
  3. ¿El formato de cualquiera de los dos está definido por la arquitectura del procesador?
pregunta

3 respuestas

7

El microcódigo es otro nivel de abstracción más allá del código de máquina. La CPU real está ejecutando microcódigo, y un motor de traducción convierte el código de máquina en microcódigo al vuelo. Esto se hace por una variedad de razones, que incluyen procesadores más rápidos y más pequeños, más fácil de crear un procesador complejo con menos depuración y para compatibilidad con versiones anteriores. Por ejemplo, el conjunto de instrucciones x86 contiene algunas instrucciones de procesamiento de cadenas que rara vez se utilizan. Sin embargo, para seguir siendo compatibles con versiones anteriores, aún deben estar disponibles en los modernos procesadores x86. En lugar de cablear una ruta de ejecución para estas instrucciones, se convierten en microcódigo y se ejecutan. Esto ahorra silicona, mientras que sigue siendo compatible con versiones anteriores.

  

¿Dónde residen ambos tipos de programas mientras se ejecutan?

El código de máquina reside en el caché (después de ser extraído de la memoria RAM). El código micro reside en un caché de código micro, dependiendo de la arquitectura de la máquina en particular. La memoria caché solo puede ser lo suficientemente grande como para contener suficiente microcódigo para mantener el microcódigo convertido de la instrucción de código de máquina más grande posible, o puede ser una memoria caché más grande que almacena los resultados convertidos de muchos códigos de máquina para que no sea necesario reconvertir todos el código de máquina en cada iteración para pequeños bucles.

En algunas arquitecturas, el microcódigo convertido no se almacena en ninguna parte: la unidad de búsqueda / traducción simplemente escupe una serie de instrucciones de microcódigo basadas en el código de máquina que se está ejecutando actualmente. En este caso, el microcódigo se ejecuta desde una ROM de algún tipo, y el código de la máquina es esencialmente un índice en la ROM, que apunta a la serie de instrucciones de microcódigo que se deben ejecutar para ejecutar completamente la instrucción del código de la máquina.

  

¿Tiene alguna asignación 1: 1 a instrucciones true-op en lenguaje ensamblador?

El código de máquina y el código de ensamblaje, en general se asignan 1: 1 a las instrucciones de ensamblaje. Depende del ensamblador. Los ensambladores de alto nivel pueden tener un gran conjunto de macros que permiten escribir una línea de código de ensamblaje y el ensamblador producirá varios códigos de máquina.

Pero en general, el lenguaje ensamblador "puro" se puede convertir directamente en código de máquina usando la tabla de conjunto de instrucciones en el manual del procesador.

Sin embargo, no estoy seguro de lo que quieres decir con "instrucciones de operación verdadera". Quizás puedas explicar la referencia.

  

¿El formato de cualquiera de los dos está definido por la arquitectura del procesador?

El formato del código de máquina y el microcódigo están definidos por la arquitectura del procesador.

    
respondido por el Adam Davis
7

Básicamente, microcódigo expande un conjunto limitado de instrucciones de CPU para contener instrucciones de nivel superior que serían complicadas de implementar en hardware, pero relativamente fáciles de compilar con las instrucciones existentes. Microcode permite que un procesador con un pequeño conjunto de instrucciones funcione como uno con un mayor conjunto de instrucciones.

Digamos que estás trabajando con un conjunto de instrucciones MARIE y te gustaría una función Add x, y, pero la arquitectura solo permite agregar x (que solo agrega lo que está actualmente en el registro a x), así que agrega una instrucción de microcódigo:

LOAD x //Load x into the register
ADD y //Add y to the value in the register

Ahora cuando su código de lenguaje de máquina dice:

ADD x,y

busca la función AGREGAR que agregó a la ROM (su microcódigo) y la ejecuta. Esto es genial porque aumenta su conjunto de instrucciones, lo que permite un código de máquina más legible, y dado que su microcódigo se almacena en la ROM, también es un poco más rápido que llamar a LOAD y ADD desde la RAM.

Solía trabajar en una empresa que en realidad escribía microcódigo para realizar mediciones personalizadas a velocidades muy altas en sus sistemas más antiguos. Sin embargo, con los avances en los FPGA, han cambiado a esos, que son mucho más rápidos (ya que en realidad estás implementando las "instrucciones personalizadas" en hardware en lugar de ROM).

    
respondido por el smoore
5

Muchos procesadores están controlados por una máquina de estados cuya secuencia de transición se ve afectada por las instrucciones que se ejecutan. Las "instrucciones" de microcódigo a menudo especifican las interacciones entre varios registros y buses de una manera que no sería visible para un programador.

Por ejemplo, una instrucción de microcódigo para una CPU de 8 bits en el estado # 1 podría especificar que las habilitaciones de salida para ambas mitades del contador del programa deberían estar activas (lo que hace que el contador del programa se emita en el bus de direcciones interno superior e inferior) ), la señal de incremento de contador de programa debe estar activa, las señales de enclavamiento de dirección externa deben estar activas (para que el bus de dirección externo rastree al interno) y la señal de lectura de RAM debe estar activa, y el controlador debe cambiar a estado # 2.

En el estado # 2, el bus de datos externo debe alimentar el bus de datos primario interno, y el registro de instrucciones, que lee desde ese bus, debe estar cargado. El contador del programa debería, como antes, salir en ambas mitades del bus de direcciones y emitirse otra lectura de RAM. Los bits 5 a 7 del registro de instrucciones deben cargarse en los bits 0 a 2 del controlador de estado, el bit 3 del registro de estado debe configurarse a menos que los bits 1 a 7 del registro de instrucciones estén todos configurados y otros bits del registro de estado. debe quedar claro, el resultado neto es que el próximo estado será # 7- # 15.

Tenga en cuenta que el microcódigo no está realmente definido en términos de instrucciones, sino en términos de combinaciones de señales de control. El hardware no se configurará para permitir instrucciones de uso general en microcódigo, sino para cargar o emitir varios registros desde / hacia los buses en los que se sientan, o conectar diferentes buses entre sí, y usar varios bits o combinaciones de los mismos para Seleccione diferentes estados. Muchos aspectos del diseño estarán cableados (por ejemplo, los códigos de operación FE y FF pueden tener una carcasa especial en hardware en lugar de microcódigo). La idea con microcódigo no es ejecutar programas, sino reemplazar la lógica.

    
respondido por el supercat

Lea otras preguntas en las etiquetas