Está en la página 1de 9

Enrique Galindo Cárdenas

Lenguaje Ensamblador

INTRODUCCIÓN

El lenguaje de programación fue creado para hacer posible el entendimiento


entre el usuario programador y la computadora; éste lenguaje tiene sus propias
características y sintaxis que varían de acuerdo al tipo de lenguaje que se use.
En la actualidad usamos un lenguaje de alto nivel que es el más fácil de
entender, pero el lenguaje de interpretación de la computadora se llama
“Lenguaje Máquina”, que no es más que números binarios (1,0) que
dependiendo de su valor, la computadora es capas de detectar los procesos
que se pueden realizar.

La definición del lenguaje ensamblador es que proporciona códigos de


operación de los mnemónicos para todas las instrucciones de la máquina
contenidas en la lista de instrucciones predeterminada, esto quiere decir que
cada mnemónico (Palabra Reservada) tiene un equivalente a un conjunto de
números binarios, abarcando en total todas las instrucciones posibles que se
es capas de realizar con la CPU (Unidad Central de Proceso) de una
computadora o del procesador de un microcontrolador; como consecuencia el
lenguaje ensamblador maneja números binarios generalmente organizados en
forma de pila debido al teorema de la Máquina de Turing.

Debido a esta característica el lenguaje ensamblador es considerado el


lenguaje más difícil de entender, de aprender y si no se sabe utilizar de forma
correcta, el más inseguro porque un mal código podría causar mucho daño a la
computadora.
Definiciones

LENGUAJE ENSAMBLADOR

Como se mencionó anteriormente también se puede definir un lenguaje


ensamblador como un lenguaje simbólico que se utiliza para codificar los
programas origen que se procesan por el ensamblador (*).

Cada computadora tiene características de CPU que hacen que un lenguaje


ensamblador varíe de acuerdo al tipo de procesador, esto también pasa con los
microcontroladores, debido a que su estructura es más simple, tienen menos
palabras reservadas, y menos poder de procesamiento y almacenamiento, lo
que hace que se derive un lenguaje específico para cada tipo de
microcontrolador.

Anteriormente se tenía un lenguaje ensamblador por cada procesado de cada


empresa, de igual forma antes se usaba más comúnmente el “lenguaje
máquina”, lo que traía como consecuencia un mayor conflicto en las
compatibilidades de los programas. Para evitar eso y con el auge de las
microcomputadoras se estandarizó un lenguaje común para la mayoría de
ellas.

Como principal consecuencia se desarrollo un sistema que fuera capas de


analizar y simular este lenguaje para evitar errores graves antes de su
ejecución, llamado ensamblador (*).

ENSAMBLADOR

Los ensambladores son programas que procesan los enunciados del programa
origen en programa ensamblador u los traducen a lenguaje máquina
guardándolos en archivos que son ejecutados o interpretados por un
microprocesador o microcontrolador.

Una de las principales características de un ensamblador es que permiten que


los programas origen se escriban y se editen en una computadora para generar
un código ejecutable en otra computadora con el mismo procesador o con uno
compatible, dejando como consecuencia un archivo en lenguaje objeto
ejecutable, generalmente llamado *.exe o *.com en el caso de la computadora
o *.hex en el caso de los microcontroladores.

Este sistema se apoya en un archivo de dato que contiene el código fuente


llamado ASM (Assembler) y con extensión *.ASM cuya característica consiste
en tener tanto el código fuente como los comentarios hechos en el programa
por el programador en código ASCII, teniendo cada enunciado origen formado
de una consecuencia de caracteres y terminando con un retorno (ENTER).
Principio de Funcionamiento

Consiste en dos etapas, en la primera etapa el programa origen (ASM) se lee


para desarrollar una tabla de símbolos ordenados, una vez terminada el archivo
objeto se va “ensamblando”, esto quiere decir que se crea con referencia a la
tabla; en la segunda etapa se crea el listado del programa origen, teniendo
como resultado el ejecutable o el archivo HEX (Hexadecimal).

Debido a que los programas que fueron ensamblados sólo contienen números
binarios, el programa es relativamente pequeño a comparación de un
ejecutable compilado en C/C++, JAVA, etc. Y a diferencia de ellos tiene mayor
eficiencia y eficacia.

El lenguaje ensamblador se puede interpretar de diferentes maneras, se puede


programar con estilo de programación estructurada que es la que más se usa o
se puede acoplar con el estilo de programación orientado a objetos, además
tiene como característica que realiza su función ejecutando proceso por
proceso completo antes de continuar a la siguiente instrucción.

Como cualquier compilador, este proceso interpreta y descarta los campos de


etiqueta, de código, de operación y de operandos según sea el caso, además
se tiene la ventaja de mostrar los posibles errores de sintaxis en el código del
programa.

Funciones y Características.

Debido a la estructura de funcionamiento de una computadora es esencial


manejar registros de memoria para poder realizar todos los procesos, de estos
registros existen cuatro de uso general que son muy importantes para cualquier
proceso de almacenamiento y operación del programa. Se usan para cálculo y
almacenamiento de propósito general. Son utilizados por los programas para
realizar cálculos, así como para transferir datos de una posición de memoria a
otra, ya que no se puede hacer de forma directa.

Es decir, que no podemos transferir un dato de la posición de memoria X a la


posición Y sin antes depositar ese dato temporalmente en un registro del
procesador. Su aplicación fuera del lenguaje ensamblador es con el uso de
gráficos en C y C++ con la librería GRAPHICS.H que a su vez necesita de
interrupciones del sistema para su funcionamiento.

Estos registros tienen una longitud de 16 bits, pero podemos descomponerlos


cuando nos interese en un par de registros de 8 bits.
Quedando de la forma siguiente:

AX = AH + AL

Siendo AX el registro de 16 bits, compuesto por la conjunción (que no la suma)


de el registro AH de 8 bits (los 8 bits más significativos o de más a la izquierda)
y el registro AL de 8 bits (los 8 bits menos significativos o de más a la derecha).

Este registro interviene en las operaciones aritméticas y lógicas, después de


una operación arroja un resultado, también se le conoce como registro
acumulador.

El registro AX es el llamado acumulador, hace que muchas operaciones tengan


una forma más corta, ya que lo especifican implícitamente. Es decir, que hay
operaciones que actúan sobre el registro AX en particular.

BX = BH + BL

BX se suele utilizar en muchas instrucciones como registro base, sobre todo en


transferencias de datos entre memoria y procesador. Se le llama registro base.

CX = CH + CL

CX es el registro contador, muchas instrucciones lo utilizan para hacer


incrementos o decrementos automáticos, para realizar bucles (LOOP) en
operación de cadenas (REP) como apuntador, etc.

DX = DH + DL

DX es el registro de datos, se suele utilizar para operaciones de 32 bits, para


almacenar los 16 bits (o palabra) más significativos, se utiliza para
multiplicación y división junto con AX y en operaciones de entrada y salida de
puertos. DL contiene el número de puertos disponibles.

Para estos tres registros se aplica lo mismo que para el registro AX.

De igual forma existen otros tipos de registros llamados registros de estado, en


total son nueve y son indicadores de 1 bit de un registros de 16 bits.

Los cuatro bits más significativos están indefinidos, mientras que hay tres bits
con valores determinados: los bits 5 y 3 siempre valen cero y el bit 1 siempre
vale uno. Que son los siguientes:
CF (Carry Flag, bit 0): Si vale 1, indica que hubo "arrastre" (un bit de más) en
caso de suma o "préstamo" en caso de resta. Este indicador es usado por
instrucciones que suman o restan números que ocupan varios bytes.

Las instrucciones de rotación pueden aislar un bit de la memoria o de un


registro poniéndolo en el CF.

PF (Parity Flag, bit 2): Si vale uno, el resultado tiene paridad par, es decir, un
número par de bits a 1.
Este indicador se puede utilizar para detectar errores en transmisiones.

AF (Auxiliary carry Flag, bit 4): Si vale 1, indica que hubo "arrastre" o
"préstamo" del nibble (cuatro bits) menos significativo al nibble más
significativo. Este indicador se usa con las instrucciones de ajuste decimal.

ZF (Zero Flag, bit 6): Si este indicador vale 1, el resultado de la operación es


cero.

SF (Sign Flag, bit 7): Refleja el bit más significativo del resultado. Como los
números negativos se representan en la notación de complemento a dos, este
bit representa el signo: 0 si es positivo, 1 si es negativo.

TF (Trap Flag, bit 8): Si vale 1, el procesador está en modo paso a paso. En
este modo, la CPU automáticamente genera una interrupción interna después
de cada instrucción, permitiendo inspeccionar los resultados del programa a
medida que se ejecuta instrucción por instrucción.

IF (Interrupt Flag, bit 9): Si vale 1, la CPU reconoce pedidos de interrupción


externas. Si vale 0, no se reconocen tales interrupciones

DF (Direction Flag, bit 10): Si vale 1, las instrucciones con cadenas sufrirán
"auto-decremento", esto es, se procesarán las cadenas desde las direcciones
más altas de memoria hacia las más bajas. Si vale 0, habrá "auto-incremento",
lo que quiere decir que las cadenas se procesarán de "izquierda a derecha".

OF (Overflow flag, bit 11): Si vale 1, hubo un desborde en una operación


aritmética con signo, esto es, un dígito significativo se perdió debido a que
tamaño del resultado es mayor que el tamaño del destino.
Aplicaciones

Un lenguaje ensamblador ayuda a aprovechar el 100% de la CPU debido a que


es una aplicación directa que permite manipular exactamente cualquier función,
por eso se aplica a procesos de tiempo real, generalmente en la industria y la
manufactura, como por ejemplo en la adquicisión de datos, control de robots,
sistemas internos en bancos, aviones, sondas espaciales, barcos, en el cine,
videojuegos, graficación y multimedia.

Existen aplicaciones especiales para la medicina, la aeronáutica y el


armamento, y en aplicaciones tan comunes como los sistemas embebidos,
como lo son: administración de impresoras, cámaras, autos, juguetes o en el
procesamiento de señales, voz e imágenes. Ya que por sus características
permite un alto rendimiento y acceso a cualquier recurso de la computadora de
forma directa.

Algunas de estas características son:

1.- Se puede acceder a cualquier localidad de la memoria RAM sin ninguna


restricción.

2.- Se pueden programar virus, debido a que se tiene un acceso total a casi
todo el hardware de la computadora vía interrupciones de software.

3.- Se pueden programar drivers de cualquier dispositivo.

4.- Se puede acceder directamente a los registros internos del cpu.

5.- Se puede acceder directamente a los dispositivos de entrada y/o salida

Para un programador es importante conocerlo porque permite conocer a detalle


cómo trabaja la computadora, pero para empezar a programar se necesita
saber la arquitectura y el juego de instrucciones del procesador. Como la
empresa de Intel ha logrado mantenerse a la cabeza de todas las empresas de
microprocesadores a unificado el lenguaje ensamblador con los siguiente
mnemónicos:
Programa

EJEMPLO 2

El lenguaje ensamblador también se usa en microcontroladores, cada uno con


su propio lenguaje. El ejemplo está hecho para un microcontrolador PIC
16F84A con su respectiva arquitectura y juego de instrucciones:

List p=16F84A

DATO1 equ 0x0C

DATO2 equ 0x0D

RESULTADO equ 0x0E

W equ 0

f equ 1

org 0x00

goto INICIO

INICIO movf DATO1,W

aadwf DATO2,W

movwf RESULTADO

end

En el ejemplo anterior se suman dos números binarios de 8 bits almacenados


en la RAM, OCH, ODH y deposita el resultado en OEH.

Un ensamblador permite el uso de macros para facilitar y disminuir el uso de


código y de memoria, en el código fuente se observa que existen dos, uno se
llama RESULTADO y otro INICIO.
EJEMPLO 3

Este ejemplo está completamente desarrollado en lenguaje ensamblador que


usa servicios o funciones de MS-DOS (system calls) para imprimir el mensaje
Hola mundo!! en pantalla.

STACK SEGMENT STACK ; Segmento de pila


DW 64 DUP (?) ; Define espacio en la pila
STACK ENDS
DATA SEGMENT ; Segmento de datos
SALUDO DB "Hola mundo!!",13,10,"$" ; Cadena
DATA ENDS
CODE SEGMENT ; Segmento de Codigo
ASSUME CS:CODE, DS:DATA, SS:STACK
INICIO: ; Punto de entrada al programa
MOV AX,DATA ; Pone direccion en AX
MOV DS,AX ; Pone la direccion en los registros
MOV DX,OFFSET SALUDO ; Obtiene direccion del mensaje
MOV AH,09H ; Funcion: Visualizar cadena
INT 21H ; Servicio: Funciones alto nivel DOS
MOV AH,4CH ; Funcion: Terminar
INT 21H
CODE ENDS
END INICIO ; Marca fin y define INICIO

La descripción del programa es como sigue:

1.- Las declaraciones SEGMENT y ENDS definen los segmentos a usar.


2.- La variable SALUDO en el segmento DATA, define la cadena a ser
desplegada. El signo de dólares al final de la cadena (denominado centinela)
es requerido por la función de visualización de la cadena de MS-DOS. La
cadena incluye los códigos para carriage-return y line-feed.
3.- La etiqueta START en el segmento de código marca el inicio de las
instrucciones del programa.
4.- La declaración DW en el segmento de pila define el espacio para ser usado
por el stack del programa.
5.- La declaración ASSUME indica que registros de segmento se asociarán
con las etiquetas declaradas en las definiciones de segmentos.
6.- Las primeras dos instrucciones cargan la dirección del segmento de datos
en el registro DS. Estas instrucciones no son necesarias para los segmentos
de código y stack puesto que la dirección del segmento de código siempre es
cargado en el registro CS y la dirección de la declaración del stack segment es
automáticamente cargada en el registro SS.
7.- Las últimas dos instrucciones del segmento CODE usa la función 4CH de
MS-DOS para regresar el control al sistema operativo. Existen muchas otras
formas de hacer esto, pero ésta es la más recomendada.
8.- La directiva END indica el final del código fuente y especifica a START
como punto de arranque
Bibliografía

1.- http://es.wikipedia.org/wiki/Assembly

2.- http://homepage.mac.com/eravila/asmix862.html

3.- http://fermat.movimage.com/docs/ensamblador/

4.- http://www.todoprogramas.com/manuales/programacion/ensamblador/

5.- http://homepage.mac.com/eravila/asmix862.html

6.- http://usuarios.lycos.es/patricio/ensam/ensam1.htm

7.- http://www.monografias.com/trabajos14/lenguaje-ensamblador/lenguaje-
ensamblador.shtml

8.- 8086/8088, programación en ensamblador


de Jürgen Hegner - 1987 - 425 páginas
Translation of the original German edition published: Augsburg : KRS
Verlagsgesellschaft, 1987

9.- Ensamblador del 80286: : IBM AT y compatibles


de H. Lilen - 1992 - 382 páginas

10.- Guía del programador en ensamblador para IBM PC, XT, AT y


compatibles
de Peter Norton, John Socha - 1988
Translation of : Assembly language book for the IBM PC

También podría gustarte