Tema 4.
Lenguaje ensamblador
Introducción
La manera en que las personas se comunican es a través de un lenguaje, una serie de signos y símbolos que todos los que pertenecen a un país comparten y así todos hablan un mismo idioma. En nuestro país todos hablamos el español, así cuando necesitas comunicarte con alguien de otro país que habla un lenguaje distinto, se hace necesario un “traductor”; algo similar ocurre con las computadoras, las que utilizan un código binario como lenguaje “nativo”, sin embargo los datos no son dados a la computadora en código binario, sino que se utiliza un lenguaje que sea comprensible a las personas que escriben las indicaciones a las computadoras sobre lo que deben hacer, los programadores.
Posteriormente, ocurre un proceso de traducción, para pasar lo escrito en el lenguaje que comprenden los programadores, el lenguaje de alto nivel que debe ser “traducido” a través de un intérprete o un compilador que traduce estos lenguajes a lenguaje ensamblador y finalmente a código binario para su ejecución por la CPU, que es el lenguaje que entienden las computadoras.
Explicación
Las computadoras requieren de una serie de instrucciones para realizar lo que se espera de ellas, las personas quienes escriben estas instrucciones se llaman programadores y construyen programas, que el microprocesador ejecuta.
Los programadores usan diversos lenguajes de programación, los llamados lenguajes de alto nivel, son aquellos cuya sintaxis o forma de escribir es muy parecida al lenguaje humano, generalmente en inglés. Sin embargo, hay que recordar que el procesador solo interpreta ceros y unos, y que a través de los buses la información viaja en bits, es decir, solo viajan ceros y unos, la memoria almacena la información en forma digital, almacenando ceros y unos; en otras palabras, usa lo que se llaman código binario, a través de este se representa la información que se va a procesar.
Glen (2012) menciona que el código binario o sistema binario es la forma en la que se representa la información que va a utilizar el procesador, para almacenar u operar todas sus instrucciones. El código binario está compuesto por dos dígitos que son el cero y el uno, así como nosotros utilizamos el sistema decimal que ocupa números del 0 al 9.
El cero y el uno del sistema binario ocupan una posición lo que se conoce como bit (binary digit), se puede decir que un bit es la representación más pequeña de información cero o uno. Un byte es un conjunto de 8 bits que se le conoce como palabra, la información se almacena en la memoria en forma de bytes, tal cómo se muestra en la siguiente figura.
Figura 1. Sistema en base diez y sistema binario.
Fuente: Glen, J. (2012). Introducción a la computación (11ª ed.). México: Pearson.
En el inicio del desarrollo de las computadoras, los programas eran escritos en código binario, lo que hacía muy complicada su escritura y modificación, cuando se ejecutaban los programas.
Por esta razón, surgieron otros sistemas numéricos que hacían más fácil el manejo de la representación de la información:
- El sistema numérico octal (0, 1, 2, 3, 4, 5, 6, 7).
- El sistema numérico hexadecimal (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F).
- Se desarrolló el lenguaje ensamblador.
El lenguaje ensamblador, es un lenguaje de programación de los llamados lenguajes de bajo nivel utilizado en computadoras, microprocesadores, micro controlador y circuitos programables.
Utiliza una representación simbólica del código máquina necesaria para programar una arquitectura de CPU. Esta representación a través de los mnemónicos (términos que sustituyen un lenguaje de máquina, lo que hace más sencillo el proceso de programación), simboliza los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras carácterísticas del lenguaje. Un lenguaje ensamblador es específico de cierta arquitectura de computador física (o virtual).
El lenguaje ensamblador se creó para hacer más sencilla la escritura de los programas, sin tenerlos que escribir directamente en código binario. Dependiendo del procesador, este ofrece un conjunto de instrucciones, es decir cualquier procesador por pequeño o grande que sea, posee su lenguaje máquina y por tanto su simbólico o ensamblador.
Un procesador puede interpretar y ejecutar instrucciones máquina. Estas instrucciones son números binarios almacenados en la CPU, si se requiere programar, hacerlo en lenguaje máquina es tedioso y muy susceptible de errores. Para mejorar este proceso, se pueden usar nombres simbólicos o nemotécnicos de las instrucciones. El resultado, es un programa simbólico, cada línea representa una posición de memoria y consta de tres campos separados por espacios, la dirección de memoria de una posición, el código de operación y un tercer campo que contienen la dirección.
A continuación, se muestra un ejemplo de un programa en ensamblador, cuya función es sumar dos valores.
Se dice que un programa escrito en un lenguaje de programación que es comprensible para los programadores, en este caso el lenguaje ensamblador, es un código fuente.
El simulador PIPPIN tiene sus propios códigos en ensamblador, un ejemplo de código ensamblador o código fuente es el siguiente:
MSG ‘Programa Suma’ | Muestra el mensaje en pantalla. |
MSG ‘Pedir dos números y realizar una suma’ | Muestra el mensaje en pantalla. |
LDT ‘Entre el Primer número’ | Lee del teclado el 1er número que se le solicita al usuario, este luego será llevado a AX. |
MOV 1C,AX | Guardo el primer número en 1C. |
LDT ‘Entre el Segundo Numero’ | Lee del teclado el 2do número que se le solicita al usuario, este luego será llevado a AX. |
MOV 1D,AX | Guardo el segundo número en 1D. |
ADD 1C | Realiza el cálculo AX = AX + 1C. |
EAP ‘Suma:’ | Muestra el Valor de AX en pantalla. |
HLT | Fin del programa. |
El siguiente enlace es externo a la Universidad Tecmilenio,
al acceder a él considera que debes apegarte a sus términos y condiciones.
Aceptar
El siguiente enlace es externo a la Universidad Tecmilenio,
al acceder a él considera que debes apegarte a sus términos y condiciones.
Aceptar
El siguiente enlace es externo a la Universidad Tecmilenio,
al acceder a él considera que debes apegarte a sus términos y condiciones.
Aceptar
Ejecutando un programa en ensamblador
Hasta ahora has podido observar el proceso de ejecución de un programa que puede escribirse en alguno de los muchos lenguajes de programación, pero que al final del proceso debe estar en código binario para su ejecución por la CPU.
Continuando con el estudio del tema, ahora se procederá a ejecutar los programas en lenguaje ensamblador, este proceso lo hace el procesador ejecutando una por una las instrucciones que conforman tu programa.
Para facilitar el entendimiento de este proceso, utilizarás un programa que simula el funcionamiento del procesador, es decir una aplicación que permite recrear el entorno de ejecución de la CPU, almacenar las instrucciones, datos y resultados en memoria en el que puedes observar paso a paso lo que sucede con la ejecución del programa, en si cómo se procesa cada instrucción.
Existen dos programas simuladores basados en la representación del modelo de la arquitectura de Von Neumann. Cada uno utiliza un conjunto de instrucciones básicas para mostrar de un modo didáctico cómo se llevan a cabo las operaciones al interior del microprocesador, estos simuladores son Von Neumann Machine Simulator y SimuProc.
Von Neumann Machine Simulator
El simulador Von Neumann Machine Simulator muestra el funcionamiento de un procesador basado en la arquitectura Von Neumann, simula la ejecución de un programa escrito en lenguaje ensamblador en el que se puede observar la ejecución de cada instrucción paso a paso; es un simulador con funciones básicas. El simulador cuenta con la siguiente distribución:
“Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos”.
Figura 2. Representación del simulador Von Neumann Machine Simulator.
Imagen obtenida de http://vnsimulator.Altervista.Org/ Sólo para fines educativos.
Memoria RAM
En la que se cargarán las instrucciones del programa en lenguaje ensamblador y la información o datos que utilizarán durante la ejecución del programa. Los tamaños de las direcciones de memoria son de 16 bits y el registro de instrucciones es de 16 bits, así tienes que el tamaño de la palabra es de 2 bytes. Estas dos secciones son:Espacio para guardar las instrucciones del programa
Este espacio va de la dirección 001 a la 110. Se puede observar la instrucción NOP, que indica que no hay ninguna operación por ser ejecutada.Espacio para almacenar datos
En los registros W, X, Y, Z y espacios T1, T2, T3 y T4. Se puede observar que en memoria tiene el valor de cero.
Figura 3. Representación de la memoria RAM en el simulador Von Neumann Machine Simulator.
Imagen obtenida de http://vnsimulator.Altervista.Org/ Sólo para fines educativos.
- Unidad de control (CU o UC)
Se integra de:
- Decodificador para interpretar las instrucciones y organizar los ciclos de instrucciones.
- MUX para seleccionar la operación a ejecutar en la ALU.
- Registro de instrucciones (IR)
Registra instrucción que se está ejecutando.
- Contador de programa (PC)
Indica la dirección de memoria en que esta la instrucción del programa que se va a ejecutar.
Buses del sistema
Que son las líneas que comunican todos los componentes del procesador.
- Unidad aritmética lógica (ALU)
Que realiza las operaciones lógicas y aritméticas. Los registros, ALU y PC no tienen valores y el PC está en posición de cero.
Figura 4. Representación de la CPU e interacción interna del simulador Von Neumann Machine Simulator.
Imagen obtenida de http://vnsimulator.Altervista.Org/#. Sólo para fines educativos.
Revisa con más detalle el modo de operación Von Neumann Machine Simulator, para conocer cómo acceder y cómo cargar un programa en memoria.
El lenguaje ensamblador está formado por instrucciones o códigos cortos que permiten al programador hacer o codificar un programa de manera sencilla. Cada procesador tiene su propio código ensamblador, todos estos códigos son similares en su código y en su uso, el simulador Von Neumann Machine Simulator cuenta con las siguientes instrucciones donde:
A es el acumulador
R es un registro de la memoria RAM: W, W, Y, Z, T1, T2, T3, T4
Operación | SIGNIFICADO |
LOD R / LOD #X | Carga el valor del registro R (o el valor entero de X) a A. |
STO R | Almacena el valor del A al registro R. |
NOP | No operar o no hacer nada y pasa a la siguiente posición de memoria. |
HLT | Fin del programa. |
ADD R / ADD #X | Suma el contenido del Acon el contenido del registro R (o el valor entero de X) y suscribe al A igual a |
SUB R / SUB #X | Resta el contenido del A con el contenido del registro R (o el valor entero de X) y suscribe al A igual a |
MUL R / MUL #X | Multiplica el contenido del A con el contenido del registro R (o el valor entero de X) y suscribe al A igual a |
DIV R / DIV #X | Divide el contenido del A con el contenido del registro R (o el valor entero de X) y suscribe al A igual a |
NOT | Si el contenido del A es 0, lo pone a 1. En caso contrario pone un 0 NOT A– |
JMP P | Ir a position P de memoria RAM. |
JMZ P | Si el A = 0 ir a posición P, sino ir a la siguiente instrucción. |
CPZ R/ CPZ #X | Si el contenido del registro R (o el valor entero X) es cero, pone el A un1. En caso contrario pone un 0. |
CPL R/ CPL #X | Si el contenido del registro R (o el valor entero X) es menor que cero, pone el A a 1. En caso contrario pone un 0. |
Para entender cómo se hace y funciona un programa en lenguaje ensamblador, verás un ejemplo, se tiene el siguiente problema:
Se desea calcular el perímetro de un rectángulo, cuya base es de 6 cm. Por 4 cm. De alto. Donde la fórmula del perímetro del rectángulo es:
P = 2 * (base + altura)
Haz clic en cada paso para revisar en qué consiste el procedimiento
Con el uso de este simulador pudiste comprender e identificar los elementos básicos que componen la arquitectura creada por Von Neumann, así como conocer un poco del conjunto de instrucciones del lenguaje ensamblador.
SimuProc
El simulador SimuProc, así como el simulador Von Neumann Machine Simulator, muestran y recrea el entorno del funcionamiento de un procesador basado en la arquitectura von Neumann.
El simulador SimuProc es un simulador más completo que tiene funciones avanzadas. El objetivo de conocer este simulador, es ver un poco más a fondo el funcionamiento del procesador y conocer el proceso interno de ejecución a través del ciclo de ejecución.
Para acceder a la instalación del simulador SimuProc, conocer el modo de operación y ver dos ejemplos completos acceder al archivo Modo de Operación SimuProc, para realizar el proceso de instalación y navegación en la aplicación, así como la carga del programa en memoria y su ejecución.
Para entender y conocer cómo funciona este simulador verás el siguiente problema:
Se requiere realizar un programa que dado el costo de un producto y la cantidad de dinero que el cliente entregue, calcula el “cambio” que hay que entregarle.
Código fuente
La figura muestra el programa almacenado en memoria y su ejecución, haz clic aquí para ver la imagen.
La siguiente tabla muestra el contenido de los componentes del simulador durante la ejecución del programa:
Paso | PC | MAR | MDR | IR | AX | 1C | 1D | Pantalla | Teclado |
1 | 0 | MSG ‘Cálculo de cambio en caja de cobro’ | 42000 | 42000 | X | ||||
2 | 1 | LDT ‘Da el precio del producto’ | 40000 | 40000 | 56 | X | X | ||
3 | 2 | MOV 1C,AX | 101C,AX | 101C,AX | 56 | ||||
4 | 3 | LDT ‘Da el valor de moneda con el que paga el cliente’ | 40000 | 40000 | 100 | X | X | ||
5 | 4 | MOV 1D,AX | 101D,AX | 101D,AX | 100 | ||||
6 | 5 | LDA 1D | 011D | 011D | 100 | ||||
7 | 6 | SUB 1C | 211C | 211C | 44 | ||||
8 | 7 | EAP ‘El cambio es:’ | 41000 | 41000 | 44 | X | |||
9 | 8 | HLT | 99000 | 99000 |
En la tabla se pueden observar los valores que van tomando los registros durante el proceso de ejecución de este programa que suma dos valores.
Esta actividad ofrece un panorama de lo que sucede a nivel interno en la CPU durante la ejecución de un proceso, así como este proceso tan sencillo, ocurren muchos otros más complejos, los cuales son transparentes para el usuario. Sin embargo, ahora tienes los elementos para conocer la tarea al interior de un microprocesador.
Las instrucciones o código que se utilizaron en los ejemplos pasados se programaron en lenguaje ensamblador de los simuladores PIPPIN y SimuProc, este código es simular al lenguaje ensamblador que se utiliza para programar los procesadores.