Miles de millones de pasos diminutos
Cuando abres un juego en la consola, su procesador empieza a ejecutar las instrucciones del juego. Ejecuta miles de millones cada segundo.
Cada instrucción es muy pequeña, como «suma estos dos números». Y todas pasan por los mismos tres pasos. Hoy los ves, uno a uno.
Al terminar esta lección
Nota
Puedo seguir el ciclo de búsqueda, decodificación y ejecución.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Instrucción | un paso pequeño que un procesador sabe dar | add a0, a0, a1 |
| Dirección de memoria | el número de un sitio de la memoria | |
| Registro | un almacén diminuto y rápido dentro del procesador | a0 |
| Contador de programa | el registro con la dirección de la siguiente instrucción | |
| Ensamblador | las instrucciones de un procesador escritas con palabras cortas | |
| Ciclo | los mismos pasos, repetidos una y otra vez |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Qué hay dentro de un procesador
Un programa espera en la memoria como una lista de instrucciones, cada una en su propia dirección.
El procesador tiene una unidad de control, que lee cada instrucción y decide qué hacer. Tiene una unidad aritmético-lógica (ALU), hecha con puertas como las de la lección pasada, que suma y compara. Y tiene registros, almacenes diminutos con los números con los que trabaja.
Las partes y su trabajo
| Parte | Su trabajo |
|---|---|
| Memoria | Guarda el programa y sus datos |
| Contador de programa | Guarda la dirección de la siguiente instrucción |
| Unidad de control | Averigua qué significa una instrucción |
| ALU | Suma, resta y hace la lógica |
| Registros como a0 y a1 | Guardan los números con los que se trabaja |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Buscar, decodificar, ejecutar y otra vez
Búsqueda: el procesador copia la instrucción que está en la dirección del contador de programa. El contador pasa a la dirección siguiente.
Decodificación: la unidad de control averigua qué pide la instrucción. Ejecución: el procesador lo hace, por ejemplo la ALU suma dos registros. Después el ciclo vuelve a empezar.
Antes de empezar
Nota
Pulsa Iniciar el laboratorio en la barra superior y espera a que la máquina diga que está en marcha. El programa que vas a leer es para un procesador RISC-V. La máquina del laboratorio no es RISC-V, así que lo ejecuta un emulador.
Entra en la carpeta arch
cd ~/archSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee un programa de cinco instrucciones
cat add.sSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Convierte las palabras en código máquina
riscv64-linux-gnu-as add.s -o add.oSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Conviértelo en un programa
riscv64-linux-gnu-ld add.o -o addSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira cada instrucción en su dirección
riscv64-linux-gnu-objdump -d addSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: seguir el programa
| Contador de programa | Instrucción | Qué hace la ejecución | a0 | a1 |
|---|---|---|---|---|
| 100b0 | li a0,2 | pone 2 en a0 | 2 | ? |
| 100b4 | li a1,3 | pone 3 en a1 | 2 | 3 |
| 100b8 | add a0,a0,a1 | la ALU los suma en a0 | 5 | 3 |
| 100bc | li a7,93 | elige la llamada que termina un programa | 5 | 3 |
| 100c0 | ecall | pide a Linux que lo termine con a0 de código | 5 | 3 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que el contador de programa cuenta cuántas instrucciones se han ejecutado. Guarda la dirección de la siguiente. Aquí sube de 4 en 4, porque cada instrucción ocupa 4 bytes. Un salto le pone otra dirección.
Copia el programa cambiando 2 por 20
sed 's/a0, 2/a0, 20/' add.s > veinte.sSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ensambla tu copia
riscv64-linux-gnu-as veinte.s -o veinte.oSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Enlaza tu copia
riscv64-linux-gnu-ld veinte.o -o veinteSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Predice y ejecútalo en el emulador
qemu-riscv64 ./veinteSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee la respuesta que dejó
echo $?Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: mira el contador
Pulsa Abrir el terminal. Construye el programa con gcc -O2 -o loop loop.c y escribe gdb ./loop. Escribe break main y después run.
Escribe info registers pc para ver el contador de programa. Escribe stepi para ejecutar una instrucción y vuelve a mirar pc. ¿Cuánto ha avanzado? Escribe quit y después y.