¿Es curioso cómo funciona el direccionamiento ALU en el código de ensamblado?

2

Al escribir el código de ensamblaje, digamos que R1 = R2 + R3, es bastante fácil entender el procedimiento de direccionamiento porque todos los registros están cerca de la ALU. Pero me resulta difícil ver cómo la ALU va a la memoria en R2 en instrucciones como R1 = R1 + M [R2]. Podría estar muy lejos, y no veo que vaya a verificar y comparar las direcciones. ¿Cómo se traduce el número hexadecimal en R2 en una ubicación de memoria?

    
pregunta user124627

3 respuestas

3

El número hexadecimal es una conveniencia basada en el hardware del procesador y la memoria. Un número hexadecimal de 4 dígitos como FA3B representa 16 dígitos en binario (1111 1010 0011 1011), que son las 16 líneas de dirección de la memoria del sistema. Existe una relación física de 1 a 1 entre los números binarios y los "cables" de hardware. Están 1 o 0 , que está activado o desactivado . Hay un poco más de 65,000 combinaciones posibles de esos 16 dígitos (2 a la 16ª potencia que todos llaman 64K).

La decodificación de esto para obtener un solo conjunto de bits de memoria se realiza en paralelo. En su idea de distancia (o alguna norma que mide qué tan difícil es alcanzar una ubicación de memoria) de la ALU, todas son la misma distancia y toman la misma cantidad de tiempo para encontrarlas. Las líneas de dirección van a circuitos de decodificación y las salidas son todas de 0, excepto la combinación que coincide con los bits de dirección. Divida esto en una matriz de 256 filas y 256 columnas para cada bit de datos. Si está obteniendo un byte, como en un AVR, hay 8 conjuntos. Esto encaja en el plano de una rebanada de silicona. Los decodificadores hacen cosas simples. Pueden tener 4 entradas y 16 salidas, como los chips lógicos de la serie 7400. Se pueden mantener así de simple y usar un montón de ellos o en chips modernos, probablemente un gran circuito decodificador. Puedes ver cómo se ramifican como un árbol a lo largo del lado de un bloque de memoria en algunas imágenes microscópicas de chips de memoria.

Verifique alguna información de tipo wiki sobre cómo funciona la RAM o más fácil de fotografiar, ROM, porque no tiene que escribir en ella. Mirando un ejemplo simple, como una ROM de 16 bytes debería dejarlo claro. - ¡Una búsqueda rápida no mostró ningún buen diagrama! Consulte la hoja de datos del 74HC138 para ver un circuito de etapa de decodificador simple .

Para una imagen mental que sea lógicamente válida, vea cada bit de memoria con dieciséis comparadores que comparan los valores en el bus de direcciones con su dirección particular de los 64K valores posibles. Todos hacen la comparación simultáneamente y solo una responde.

Si eso suena como que usaría mucho poder, lo haría. En realidad es una estrategia de divide y vencerás. Toma el dígito más alto. En el caso o FA3B, el bit binario más significativo es 1. Eso significa que la ubicación está en los 32K superiores de memoria, por lo que los 32K inferiores ni siquiera necesitan estar encendidos. El siguiente bit es un 1 por lo que está en el 16K superior del 32 K. superior. Luego, el 8K superior y el 4K superior y el 2K superior. Finalmente un 0! Así que está en el 1K inferior de ese último 2K, luego en el 512 superior de eso y el 256 inferior de eso y el 128 inferior de ese y el 64 inferior en el superior 32 superior 16 superior 8 superior 4 superior 2 y finalmente es el superior De las dos últimas posibilidades. Creo que conté bien.

Como puede ver, si organiza la memoria en pequeños bloques, ni siquiera tiene que encender la mayoría si se trata de un acceso en particular. Puede usar la lógica de dirección para encender también la parte del chip que se necesita sobre la marcha, por así decirlo.

Todo esto para emular el modelo de dirección lineal de la ALU (o la cinta de una máquina de Turing).

    
respondido por el C. Towne Springer
1

En mi opinión: R1 = R1 + M [R2] no es una de las instrucciones más básicas que la CPU puede ejecutar en un solo ciclo de reloj.

Si la CPU no admite esta instrucción, el compilador debería traducir esto en 2 más simples: el primero carga los datos en un registro temporal, el segundo agrega esos valores a R1. Tenga en cuenta que el registro temporal puede o no estar disponible desde la perspectiva del programador.

De lo contrario, se requieren al menos 2 ciclos de reloj para que la CPU realice 2 acciones separadas.

Puede verificar mi opinión buscando los ciclos de reloj requeridos de esa instrucción en la hoja de datos de la CPU.

    
respondido por el jcoffee
1

Hay dos tipos principales de ISA de computadoras (arquitecturas de conjuntos de instrucciones): RISC y CISC. RISC significa Instrucción reducida Configurar computadora. No significa que haya menos instrucciones, significa que cada instrucción es menos capaz. En tal ISA si quieres hacer esto:

ADD R1 R1 M[R2]

Tendrá que codificarlo así:

LOAD TEMP M[R2]
ADD R1 R1 TEMP

Ahora, tenemos arquitecturas como la omnipresente ISA x86. Estas son las ISA de CISC, lo que significa que cada instrucción es muy poderosa. De hecho, puede copiar una cadena completa en un ensamblaje x86 como este:

REP MOVSB

Y puede tener instrucciones de registro de memoria como la que describió:

MOV EAX [EBX]

Lo que significa tomar EAX = EAX + M (EBX).

El chip x86 original estaba microcodificado, lo que significa que la instrucción anterior se convertiría en dos instrucciones de estilo RISC más simples, que luego se ejecutarán de forma secuencial. Luego obtuvieron procesadores segmentados, donde tenían etapas de memoria para acceder a la memoria. Ahora como lo describiste, fue complicado y lento.

Hoy en día, el decodificador de instrucciones x86 decodifica estas instrucciones en una ISA interna similar a RISC, que luego se ejecuta. ¡Puedes buscar la microarquitectura Haswell para ver cómo funciona su última microarquitectura!

    
respondido por el Saad

Lea otras preguntas en las etiquetas