# computadora de papel lang=es adaptación de la wdr papiercomputer; modelo sencillo de una arquitectura computacional común. => https://wiki.xxiivv.com/site/papier.html papier computer => ./computer_architecture.gmi {computer architecture} para la versión bailada, ve {danza papier} # materiales necesitamos una hoja de papel, algún instrumento para marcarla, y múltiples objetos de una misma clase (frijoles, palillos, canicas, fichas, etc). ## memoria(s) la hoja la dividiremos en dos partes: * memoria de programa * memoria de datos (registros) cada una de esas partes estará dividida en múltiples recuadros numerados. en esta primera versión, numeremos del 0 al 9. cada recuadro está dividido a la mitad. => ./img/dibujo_papiercomputer-tabla.png dibujo mostrando una hoja dividida en dos secciones, cada una con 10 recuadros numerados del 0 al 9, y cada recuadro dividido a la mitad. el objeto que usamos para marcarla nos puede servir para indicar nuestra posición actual en la memoria de programa. # lista de instrucciones la computadora cuenta con los 5 siguientes códigos de operación. el código es su identificador numérico único, y entre paréntesis se muestra su mnemónico * 0: Fin del programa (FIN) * 1: Condicional (CND) * 2: Salta a instrucción (SLT) * 3: Incrementa registro (INC) * 4: Decrementa registro (DEC) una instrucción completa consiste de ese código de operación, acompañada de un número llamado argumento u operando. ## operandos ese operando tiene un significado distinto según la instrucción: * FIN: argumento ignorado * CND: el argumento es el número de Registro a consultar: si los contenidos de ese registro son 0, hay que saltarse una instrucción, y si no, hay que continuar normalmente con la siguiente. * SLT: el argumento es el número de línea a la cual saltar a continuación * INC: el argumento es el número de Registro que ha de incrementarse * DEC: el argumento es el número de Registro que ha de decrementarse ## descripción podemos expresar a las instrucciones de la siguiente manera: * FIN: termina la ejecución del programa * CND Rx: si el registro Rx tiene un valor igual a 0, salta una instrucción; si no, continúa normalmente * SLT x: salta a la instrucción del programa número x * INC Rx: súmale 1 al registro Rx * DEC Rx: réstale 1 al registro Rx # ciclo de instrucción iniciamos con nuestro apuntador en la instrucción número 0. el ciclo que seguiremos será: * fetch: lee la instrucción almacenada en donde está el apuntador * execute: ejecuta la instrucción correspondiente, y actualiza la posición del apuntador. en las instrucciones INC y DEC, el apuntador siempre avanza a la siguiente casilla. en la instrucción SLT, el apuntador se mueve a la casilla indicada como argumento. en la instrucción CND, el apuntador se mueve a la casilla siguiente, o una más abajo, dependiendo de la condición indicada. # ejemplo de programa este programa suma los números que están en R0 y R1, colocando el resultado en R0 ## lista de números este es el programa en formato de lista de números a colocar en la memoria de programa. * 0: 2 3 * 1: 4 1 * 2: 3 0 * 3: 1 1 * 4: 2 1 * 5: 0 0 el primer dígito en la lista es el número de línea. los dos dígitos siguientes son el primer y segundo números de instrucción ## lenguaje ensamblador usando las palabras clave (mnemónicos) para indicar los códigos de operación, el programa se vería así: * 0: SLT 3 (salta a la línea 3) * 1: DEC 1 (decrementa R1) * 2: INC 0 (incrementa R0) * 3: CND 1 (¿R1 es 0? si sí, salta una instrucción, si no, continúa) * 4: SLT 1 (salta a la línea 1) * 5: FIN 0 (fin del programa) (esta forma de programar, en lenguaje ensamblador, es a la que se refiere la práctica de {s-camino})