¿Tiene curiosidad por saber cómo funciona el direccionamiento ALU como en el código ensamblador?

Al escribir código ensamblador, digamos 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 lo veo revisando y comparando las direcciones. ¿Cómo traduce el número hexadecimal en R2 a una ubicación de memoria?

¿Está preguntando sobre la arquitectura general de la computadora o está considerando una arquitectura/CPU específica?
arquitectura informática general, ¿sería diferente para una arquitectura específica?
Dónde empezar.. :)
Sí, hay diferentes formas de hacerlo y puedes ser tan creativo como quieras.
Estoy en blanco sobre esto, no puedo ver cómo el hexadecimal podría resultar en una ubicación de memoria. y qué hacer cuando está demasiado lejos?
La ALU no hace la M[R2]parte. Eso es manejado por una parte diferente de la CPU.
Además, los números no se almacenan en hexadecimal.

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" del hardware. Son 1 o 0 , que está activado o desactivado . Hay un poco más de 65,000 combinaciones posibles de esos 16 dígitos (2 elevado a la 16, lo que todos llaman 64K).

La decodificación de esto para llegar a un solo conjunto de bits de memoria se realiza en paralelo. En su idea de la distancia (o alguna norma que mide qué tan difícil es alcanzar una ubicación de memoria) desde la ALU, todos están a la misma distancia y toman la misma cantidad de tiempo para encontrarlos. Las líneas de dirección van a los circuitos de decodificación y las salidas son todas 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 plano de una rebanada de silicio. 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 simples y usar un montón de ellos o en chips modernos, más probablemente un gran circuito decodificador.

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

Para obtener una imagen mental que sea lógicamente válida, considere que cada bit de memoria tiene 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 a la vez y solo uno contesta.

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

Como puede ver, si organiza la memoria en pequeños bloques, ni siquiera tiene que encenderla para ningún 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 ello para emular el modelo de dirección lineal de la ALU (o la cinta de una Máquina de Turing).

muchas gracias, lo aprecio mucho... mi segunda mejor respuesta en este sitio

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 debe traducir esto en 2 más simples: la primera carga datos en un registro temporal, la segunda 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 necesitan 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.

¿Cómo traduce la memoria que escribió en su código ensamblador, en una memoria física real?
¿M[R2] significa: una ubicación dirigida a R2 en la memoria (M)?
significa una ubicación de memoria especificada por el valor R2.

Hay dos tipos principales de ISA (arquitecturas de conjuntos de instrucciones) de computadora: RISC y CISC. RISC significa Computadora con conjunto de instrucciones reducido . No significa que haya menos instrucciones, significa que cada instrucción es menos capaz. En tal ISA, si desea hacer esto:

ADD R1 R1 M[R2]

Tendrás que codificarlo así:

LOAD TEMP M[R2]
ADD R1 R1 TEMP

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

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ían secuencialmente. Luego obtuvieron procesadores canalizados, 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 un ISA interno similar a RISC, que luego se ejecuta. ¡Puede buscar la microarquitectura Haswell para ver cómo funciona su última microarquitectura!

Wow gracias. estaba teniendo problemas para visualizar las diferencias de ISA, supongo que esto lo explica todo