Tabla de contenido:
- Paso 1: Lista de piezas
- Paso 2: Jerarquía y códigos del lenguaje de la máquina
- Paso 3: Anatomía de las instrucciones de BYOC-I
- Paso 4: codificación de una instrucción informática
- Paso 5: Anatomía de un programa de computadora
- Paso 6: Transferencia del programa a la memoria y prueba
Video: Codifique y pruebe una computadora en lenguaje de máquina: 6 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
En este Instructable, le mostraré cómo codificar y probar un programa de computadora en lenguaje de máquina. El lenguaje de máquina es el idioma nativo de las computadoras. Debido a que está compuesto por cadenas de 1 y 0, los humanos no lo entienden fácilmente. Para solucionar esto, primero codificamos los programas en un lenguaje de alto nivel como C ++ o Java y luego usamos programas informáticos especiales para traducirlos a los 1 y 0 que las computadoras entienden. Aprender a codificar en un lenguaje de alto nivel es sin duda una obviedad, pero una breve introducción al lenguaje de máquina puede proporcionar información valiosa sobre cómo funcionan las computadoras y aumentar la apreciación de esta tecnología tan importante.
Para codificar y probar un programa en lenguaje de máquina, necesitamos acceso a una computadora sencilla cuyo lenguaje de máquina se entienda fácilmente. Las computadoras personales son demasiado complejas para siquiera considerarlas. La solución es utilizar Logisim, un simulador lógico que se ejecuta en una computadora personal. Con Logisim podemos simular un ordenador que se adapte a nuestras necesidades. El video de arriba le da una idea de lo que podemos lograr con Logisim.
Para el diseño de la computadora, adapté uno de mi libro electrónico Kindle Build Your Own Computer - From Scratch. Comencé con la computadora BYOC descrita allí y la reduje a la variedad BYOC-I básica (I para Instructable) que usaremos en este Instructable.
El lenguaje de máquina de BYOC-I es simple y fácil de entender. No necesitará ningún conocimiento especial de computadoras o programación. Todo lo que se requiere es una mente inquisitiva y un deseo de aprender
Otras lecturas
Quizás se pregunte por qué usamos "máquina" para describir una computadora cuando no es un dispositivo mecánico. La razón es histórica; los primeros dispositivos informáticos eran mecánicos y consistían en engranajes y ruedas. La letra de Allan Sherman, "Fue todo engranaje haciendo clic-clac …" fue sólo un siglo o dos. Lea más sobre la computación temprana aquí.
Paso 1: Lista de piezas
La lista de piezas es corta. Solo se requieren estos dos elementos, ambos descargables gratis:
- "Logisim-win-2.7.1.exe": Logisim es un simulador lógico popular y fácil de usar. Descargue el archivo ejecutable Logisim desde aquí y luego cree un atajo en un lugar conveniente como su escritorio. Haga doble clic en el icono de Logisim para iniciarlo. Nota: Logisim utiliza Java Runtime Package que se encuentra aquí. Es posible que se le pida que lo descargue.
- BYOC-I-Full.cir ": descargue el archivo del circuito Logisim a continuación.
Inicie Logisim, luego haga clic en "Archivo-Abrir" y cargue el archivo BYOC-I-Full.cir. La imagen de arriba muestra el entorno de trabajo de Logisim. El BYOC-I está representado por el bloque de subcircuitos. Conectadas externamente hay dos entradas, Reset y Run, y pantallas hexadecimales para los registros y la memoria de programa del BYOC-I.
La memoria de programa del BYOC-I está precargada con un programa simple que cuenta de 1 a 5 en el registro A. Para ejecutar (Ejecutar) el programa, siga estos pasos.
Paso 1: haga clic en la herramienta Poke. El cursor debería cambiar al "dedo" que empuja. Paso 2 - Pulsa la entrada Reset dos veces, una vez cambiándola a "1" y otra vez para volver a cambiarla a "0". Esto restablece el BYOC-I para iniciar el programa en la dirección 0. Paso 3: presione la entrada Ejecutar una vez para cambiarla a "1". El registro A debe mostrar que el conteo cambia de 1 a 5 y luego se repite. Paso 4 - Si el programa no se ejecuta, presione control-K y debería comenzar.
Si desea explorar las capacidades de Logisim, haga clic en el enlace Ayuda en la barra de menú. Desde allí, puede explorar el "Tutorial", la "Guía del usuario" y la "Referencia de la biblioteca" de Logisim. Aquí encontrará una excelente introducción en video.
Paso 2: Jerarquía y códigos del lenguaje de la máquina
La computadora BYOC-I realiza tareas basadas en programas escritos en lenguaje máquina. Los programas BYOC-I, a su vez, se componen de instrucciones ejecutadas en una secuencia bien definida. Cada instrucción está formada por códigos de longitud fija que representan varios componentes operativos del BYOC-I. Finalmente, estos códigos consisten en cadenas de 1 y 0 que constituyen el lenguaje de máquina que BYOC-I realmente ejecuta.
A modo de explicación, comenzaremos con códigos y avanzaremos hasta el nivel del programa. Luego codificaremos un programa simple, lo cargaremos en la memoria del BYOC-I y lo ejecutaremos.
Los códigos consisten en un número fijo de dígitos o bits binarios (1 y 0), para abreviar. Por ejemplo, la siguiente tabla muestra todos los códigos posibles (16 en total) para un código de 4 bits de ancho. Junto al código se muestra el hexadecimal (base 16) y el equivalente decimal. El hexadecimal se utiliza para referirse a valores binarios, ya que es más compacto que binario y más fácil de convertir de binario que decimal. El prefijo "0x" le permite saber que el número que sigue es hexadecimal o "hexadecimal" para abreviar.
Binario - Hexadecimal - Decimal0000 0x0000 00001 0x0001 10010 0x0002 20011 0x0003 30100 0x0004 40101 0x0005 50111 0x0007 71000 0x0008 81001 0x0009 91010 0x000A 101011 0x000B 111100 0x000C 121101 0x000x 13111011
El ancho de un código determina cuántos elementos se pueden representar. Como se señaló, el código de 4 bits de ancho anterior puede representar hasta 16 elementos (0 a 15); es decir, 2 por 2 tomado cuatro veces o 2 a la 4ª potencia es igual a 16. En general, el número de elementos representables es 2 elevado a la enésima potencia. Aquí hay una breve lista de capacidades de código de n bits.
n - Número de artículos1 22 43 84165326647 1288256
Los anchos de código de computadora BYOC-I se eligen para acomodar el número de elementos que serán representados por el código. Por ejemplo, hay cuatro tipos de instrucciones, por lo que es adecuado un código de 2 bits de ancho. Aquí están los códigos BYOC-I con una breve explicación de cada uno.
Código de tipo de instrucción (tt) Hay cuatro tipos de instrucciones: (1) MVI: mueve un valor constante inmediato de 8 bits a un registro de memoria. El registro de memoria es un dispositivo que contiene datos que se utilizarán para un cálculo, (2) MOV: mueve datos de un registro a otro, (3) RRC: realiza un cálculo de registro a registro y (4) JMP: salto a una instrucción diferente en lugar de continuar con la siguiente instrucción. Los códigos de tipo de instrucción BYOC-I adoptados son los siguientes:
00 MVI01 MOV10 RRC11 JMP
Código de registro (dd y ss) El BYOC-I tiene cuatro registros de 8 bits capaces de almacenar valores de 0 a 255. Un código de 2 bits es suficiente para designar los cuatro registros:
00 Registro F 01 Registro E 10 Registro D 11 Registro A
Código de cálculo (ccc) El BYOC-I admite cuatro operaciones aritméticas / lógicas. Para permitir la expansión futura a ocho cálculos, se utiliza un código de 3 bits:
000 ADD, sumar dos valores de 8 bits en los registros designados y almacenar el resultado en uno de los registros 001 SUB, restar dos valores de 8 bits en los registros designados y almacenar el resultado en uno de los registros 010 - 011 Reservado para uso futuro 100 Y, lógicamente Y dos valores de 8 bits en registros designados y almacenar el resultado en uno de los registros 101 O, lógicamente O dos valores de 8 bits en registros designados y almacenar el resultado en uno de los registros 110 a 111, Reservado para uso futuro
Código de salto (j) Un código de 1 bit que indica si el salto es incondicional (j = 1) o si está condicionado a un resultado de cálculo distinto de cero (j = 0).
Datos / Código de dirección (v… v) / (a… a) Se pueden incluir datos de 8 bits en ciertas instrucciones que representan valores de 00000000 a 11111111 o de 0 a 255 decimal. Estos datos tienen un ancho de 8 bits para su almacenamiento en los registros de 8 bits de BYOC-I. Con la aritmética decimal, no mostramos ceros a la izquierda. Con la aritmética informática, mostramos ceros a la izquierda, pero no afectan el valor. 00000101 es numéricamente lo mismo que un decimal 101 o 5.
Referencias sugeridas
Notación binaria - https://learn.sparkfun.com/tutorials/binaryNotación hexadecimal -
Otras lecturas
La idea de utilizar códigos para impulsar un proceso se remonta a mucho tiempo atrás. Un ejemplo fascinante es el Jacquard Loom. El telar automático estaba controlado por una cadena de tarjetas de madera en las que se perforaban agujeros que representaban códigos para hilos de diferentes colores para tejer. Vi el primero en Escocia, donde se usaba para hacer tartanes coloridos. Lea más sobre los telares Jacquard aquí.
Paso 3: Anatomía de las instrucciones de BYOC-I
Dados los códigos de BYOC-I, pasamos al siguiente nivel, las instrucciones. Para crear una instrucción para el BYOC-I, colocamos los códigos juntos en un orden específico y en ubicaciones específicas dentro de la instrucción. No todos los códigos aparecen en todas las instrucciones pero, cuando lo hacen, ocupan una ubicación específica.
El tipo de instrucción MVI requiere la mayor cantidad de bits, 12 en total. Al hacer que la palabra de instrucción tenga una longitud de 12 bits, acomodamos todas las instrucciones. A los bits no utilizados (los llamados "no importa") se les asigna el valor 0. Aquí está el conjunto de instrucciones BYOC-I.
- Mover inmediatamente (MVI) - 00 dd vvvvvvvv Función: Mover un valor de datos de 8 bits V = vvvvvvvv al registro de destino dd. Después de la ejecución, el registro dd tendrá el valor vvvvvvvv. Abreviatura: MVI R, V donde R es A, D, E o F. Ejemplo: 00 10 00000101 - MVI D, 5 - Mueva el valor 5 al registro D.
- Mover registro a registro (MOV) - 01 dd ss 000000 Función: Mover datos desde el registro de origen ss al registro de destino dd. Después de la ejecución, ambos registros tienen el mismo valor que el registro fuente. Abreviatura: MOV Rd, Rs donde Rd es el registro de destino A, D, E o F y Rs es el registro de origen A, D, E o F. Ejemplo: 01 11 01 000000 - MOV A, E - Mover el valor en el registro E para registrar A.
- Registrar para registrar cálculo (RRC) - 10 dd ss ccc 000 Función: Realizar el cálculo designado ccc usando el registro de origen ss y el registro de destino dd y luego almacenar el resultado en el registro de destino Abreviaturas: ADD Rd, Rs (ccc = 000 Rd + Rs almacenados en Rd); SUB Rd, Rs (ccc = 001 Rd - Rs almacenados en Rd); Y Rd, Rs (ccc = 100 Rd Y Rs almacenados en Rd); OR Rd, Rs (ccc = 101 Rd OR Rs almacenados en Rd). Ejemplo: 10 00 11 001 000 - SUB F, A - Reste el valor en el registro A del registro F con el resultado en el registro F.
- Saltar a instrucción diferente (JMP) - 11 j 0 aaaaaaaa Función: Cambiar la ejecución a una instrucción diferente ubicada en la dirección aaaa aaaa (a) Incondicionalmente (j = 1) -11 1 0 aaaaaaaa Abreviatura: JMP L donde L es la dirección aaaa aaaa Ejemplo: 11 1 0 00001000 - JMP 8 - Cambiar la ejecución a la dirección 8. (b) Condicionalmente (j = 0) cuando el cálculo anterior dio como resultado un resultado distinto de cero - 11 0 0 aaaaaaaa Abreviatura: JNZ L donde L es la dirección aaaa aaaa Ejemplo: 11 0 0 00000100 JNZ 4 Si el último cálculo arrojó un valor distinto de cero, cambie la ejecución a la dirección 4.
Los bits de la palabra de instrucción se numeran de izquierda (bit más significativo MSB) a derecha (bit menos significativo LSB) de 11 a 0. El orden fijo y las ubicaciones de los códigos son los siguientes:
Bits - Code11-10 Tipo de instrucción9-8 Registro de destino7-6 Registro de origen5-3 Cálculo: 000 - agregar; 001 - restar; 100 - AND lógico; 101 - OR lógico 7-0 Valor constante v… v y a… a (0 a 255)
El conjunto de instrucciones se resume en la figura anterior. Tenga en cuenta la apariencia estructurada y ordenada de los códigos en cada instrucción. El resultado es un diseño más simple para el BYOC-I y hace que las instrucciones sean más fáciles de entender para los humanos.
Paso 4: codificación de una instrucción informática
Antes de pasar al nivel de programa, construyamos algunas instrucciones de ejemplo utilizando el conjunto de instrucciones BYOC-I anterior.
1. Mueva el valor 1 al registro A. Los registros BYOC-I pueden almacenar valores de 0 a 255. En este caso, el registro A tendrá el valor 1 (00000001 binario) después de la ejecución de la instrucción.
Abreviatura: MVI A, 1Códigos necesarios: Tipo MVI - 00; Registro de destino A - 11; Valor - 00000001 Palabra de instrucción: 00 11 00000001
2. Mueva el contenido del registro A al registro D. Después de la ejecución, ambos registros tendrán el valor originalmente en el registro A.
Abreviatura: MOV D, A (Recuerde, el destino es el primero y la fuente el segundo en la lista) Códigos requeridos: Tipo MOV - 01; Registro de destino D - 10; Registro fuente A - 11 Palabra de instrucción: 01 10 11 000000
3. Agregue el contenido del registro D al registro A y guárdelo en el registro A. Después de la ejecución, el valor del registro A será la suma del valor original del registro A y el registro D.
Abreviatura: ADD A, D (El resultado se almacena en el registro de destino) Códigos requeridos: Tipo RRC - 10; Registro de destino A - 11; Registro fuente D - 10; Cálculo Agregar - 000 Palabra de instrucción: 10 11 10000000 (ccc es el primer 000 - agregar)
4. Salte en no cero a la dirección 3. Si el resultado del último cálculo no fue cero, la ejecución cambiará a la instrucción en la dirección dada. Si es cero, la ejecución se reanuda en la siguiente instrucción.
Abreviatura: JNZ 3 Códigos necesarios: Tipo JMP - 11; Tipo de salto - 0; Dirección - 00000003 Palabra de instrucción: 11 0 0 00000003 (el tipo de salto es el primer 0)
5. Salte incondicionalmente a la dirección 0. Después de la ejecución, la ejecución cambia a la instrucción en la dirección dada.
Abreviatura: JMP 0 Código requerido: Tipo JMP - 11; Tipo de salto - 1; Dirección - 00000000 Palabra de instrucción; 11 1 0 00000000
Si bien la codificación automática es algo tediosa, puede ver que no es increíblemente difícil. Si estuviera codificando una máquina de verdad, usaría un programa de computadora llamado ensamblador para traducir de la abreviatura (que se llama código ensamblador) a código máquina.
Paso 5: Anatomía de un programa de computadora
Un programa de computadora es una lista de instrucciones que la computadora ejecuta comenzando por el principio de la lista y continuando hacia abajo hasta el final. Las instrucciones como JNZ y JMP pueden cambiar qué instrucción se ejecuta a continuación. Cada instrucción en la lista ocupa una sola dirección en la memoria de la computadora comenzando en 0. La memoria BYOC-I puede contener una lista de 256 instrucciones, más que suficiente para nuestros propósitos.
Los programas de computadora están diseñados para realizar una tarea determinada. Para nuestro programa, elegiremos una tarea simple, contando del 1 al 5. Obviamente, no hay una instrucción de "conteo", por lo que el primer paso es dividir la tarea en pasos que puedan ser manejados por el propio BYOC-I. conjunto de instrucciones limitado.
Paso 1 Mueva 1 para registrar A Paso 2 Mueva el registro A para registrar D Paso 3 Agregue el registro D al registro A y almacene el resultado en el registro A Paso 4 Mueva 5 para registrar ES Paso 5 Reste el registro A del registro E y almacene el resultado en el registro ES Paso 6 Si el resultado de la resta no fue cero, regrese al paso 4 y continúe contando Paso 7 Si el resultado de la resta fue cero, regrese y comience de nuevo
El siguiente paso es traducir estos pasos en instrucciones BYOC-I. Los programas BYOC-I comienzan en la dirección 0 y se numeran consecutivamente. Las direcciones de destino de salto se agregan en último lugar después de que se hayan implementado todas las instrucciones.
Dirección: Instrucción - Abreviatura; Descripción 0: 00 11 00000001 - MVI A, 1; Mueva 1 al registro A1: 01 10 11 000000 - MOV D, A; Mueva el registro A al registro D2: 10 11 10000000 - ADD A, D; Agregue el registro D al registro A y almacene el resultado en el registro A3: 00 01 00 00000101 - MVI E, 5; Mueva el registro 5 E4: 10 01 11 001000 - SUB E, A; Reste el registro A del registro E y almacene el resultado en el registro E5: 11 0 0 00000010 - JNZ 2; Si el resultado de la resta no fue cero, regrese a la dirección 3 y continúe contando 6: 11 1 0 00000000 - JMP 0; Si el resultado de la resta fue cero, regrese y comience de nuevo
Antes de transferir el programa a la memoria, el código de instrucción binaria debe cambiarse a hexadecimal para usarlo con Logisim Hex Editor. Primero, divida la instrucción en tres grupos de 4 bits cada uno. Luego, traduzca los grupos a hexadecimal usando la tabla en el Paso 2. Solo se usarán los últimos tres dígitos hexadecimales (en negrita a continuación).
Dirección - Instrucción Binaria - Instrucción División binaria - Instrucción (Hex) 0 001100000001 0011 0000 0001 - 0x03011 011011000000 0110 1100 0000 - 0x06C02 101110000000 1011 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x010 1100000101 0001 0000 0101 - 0x010 1100x00000 001 111000000010 1110 0000 0000 - 0x0E00
Es hora de transferir el programa a la memoria del BYOC-I para realizar pruebas.
Paso 6: Transferencia del programa a la memoria y prueba
Mirando el circuito "principal" de Logisim, el bloque BYOC-I que se muestra es el símbolo del circuito de computadora real etiquetado como "BYOC-I" en el Panel del Explorador. Para ingresar un programa en la memoria BYOC-I:
- Haga clic con el botón derecho en el bloque BYOC-I (llamado "subcircuito") y seleccione (coloque el cursor sobre y haga clic con el botón izquierdo) "Ver BYOC-I".
- El circuito BYOC-I aparecerá en el Área de trabajo. Haga clic con el botón derecho en el símbolo "Memoria de programa" y seleccione "Editar contenido …".
- Con Logisim Hex Editor, ingrese el código hexadecimal (solo en negrita) como se muestra arriba.
Ahora está listo para ejecutar el programa. Regrese al circuito principal haciendo doble clic en "BYOC-I" en el panel del explorador. Las entradas Run y Reset deben ser "0" para comenzar. Usando la herramienta Poke, primero cambie Reset a "1" y luego vuelva a "0". Esto hace que la dirección inicial sea 0x0000 y prepara el circuito BYOC-I para su ejecución. Ahora coloque la entrada Ejecutar en "1" y el programa se ejecutará. (Nota: Principalmente necesita presionar Control-K una vez para iniciar el reloj Logisim. Esta es una característica que le permite detener el reloj Logisim y recorrer un programa presionando Control-T repetidamente. ¡Pruébelo alguna vez!)
El reloj Logisim se puede configurar para una amplia gama de frecuencias. Como se descargó, es de 8 Hz (8 ciclos por segundo). Según la forma en que está diseñada la computadora BYOC-I, cada instrucción tarda cuatro ciclos de reloj en completarse. Entonces, para calcular la velocidad de BYOC-I, divida la frecuencia del reloj entre 4. A 8 Hz, su velocidad es de 2 instrucciones por segundo. Puede cambiar el reloj haciendo clic en "Simular" en la barra de herramientas y seleccionando "Frecuencia de tick". El rango posible es de 0,25 Hz a 4100 Hz. Se eligió la velocidad lenta a 8 Hz para que pudiera ver el conteo en el registro A.
La velocidad máxima de la simulación BYOC-I (~ 1000 instrucciones por segundo) es muy lenta en comparación con las computadoras modernas. ¡La versión de hardware de la computadora BYOC descrita en mi libro se ejecuta a más de 12 millones de instrucciones por segundo!
Espero que este Instructable haya desmitificado la programación en lenguaje de máquina y le haya dado una idea de cómo funcionan las computadoras en su nivel más básico. Para asegurar su comprensión, intente codificar los dos programas siguientes.
- Escriba un programa que comience en 5 y cuente hacia atrás hasta 0. (ANS. Count5to0.txt a continuación)
- Comenzando en 2, cuente de 3 en 3 hasta que el número exceda 7. Puede hacer un poco de aritmética mental, verifique el 8 sabiendo que aterrizará allí y luego reinicie. Escriba su programa de una manera más general que realmente pruebe si el recuento "excede" un número específico. Sugerencia: Explore lo que sucede cuando una resta arroja un valor negativo, digamos 8 - 9 = -1 por ejemplo. Luego experimente con el Y lógico para probar si el MSB en un número de 8 bits es "1". (ANS. ExceedsCount.txt)
¿Puede pensar en otros problemas desafiantes para la computadora BYOC-I? Dadas sus limitaciones, ¿qué más puede hacer? Comparta sus experiencias conmigo en [email protected]. Si está interesado en codificar microprocesadores, visite mi sitio web www.whippleway.com. Allí llevo codificación de máquina a procesadores modernos como la serie ATMEL Mega utilizada en Arduinos.
Recomendado:
Pruebe Arduino desnudo, con software de juego usando entrada capacitiva y LED: 4 pasos
Pruebe Arduino desnudo, con software de juego usando entrada capacitiva y LED: " Push-It " Juego interactivo que usa una placa Arduino desnuda, no se necesitan partes externas ni cableado (usa una entrada capacitiva 'táctil'). Como se muestra arriba, muestra cómo se ejecuta en dos tableros diferentes. Push-It tiene dos propósitos. Para demostrar rápidamente / v
¡Reutilice el panel táctil de una computadora portátil vieja para controlar una computadora !: 11 pasos (con imágenes)
¡Reutilice el panel táctil de una computadora portátil vieja para controlar una computadora! Los gestos de deslizar y tocar con los dedos pueden resultar para controlar las cosas de una manera bastante simple y divertida. En este Instructable, combinemos uno con
Pruebe su velocidad de Internet con Raspberry Pi + Ubidots: 9 pasos
Pruebe su velocidad de Internet con Raspberry Pi + Ubidots: Raspberry Pi se ha convertido en un dispositivo ampliamente utilizado no solo para la creación de prototipos y con fines educativos, sino también para proyectos de producción industrial dentro de las empresas. Además del tamaño, el bajo costo y el sistema operativo Linux completamente operativo de Pi, también puede interactuar con
Cómo actualizar una CPU PORTÁTIL (y otras cosas interesantes) para convertir una computadora portátil LENTA / MUERTA en una computadora portátil RÁPIDA: 4 pasos
Cómo actualizar una CPU PORTÁTIL (y otras cosas interesantes) para convertir una computadora portátil LENTA / MUERTA en una computadora portátil RÁPIDA!: ¡Hola a todos! Recientemente adquirí una computadora portátil Packard Bell Easynote TM89, que tenía especificaciones demasiado bajas para mi gusto, básicamente muy desactualizado … La pantalla LCD se rompió y el disco duro principal se había bloqueado, por lo que la computadora portátil estaba prácticamente muerta … Ver la foto y
Use SSH y XMing para mostrar programas X desde una computadora con Linux en una computadora con Windows: 6 pasos
Use SSH y XMing para mostrar programas X desde una computadora con Linux en una computadora con Windows: si usa Linux en el trabajo y Windows en casa, o viceversa, es posible que a veces necesite iniciar sesión en la computadora en su otra ubicación y ejecutar programas. Bueno, puede instalar un servidor X y habilitar el túnel SSH con su cliente SSH, y uno