Post on 30-Jun-2015
description
transcript
INTRODUCCION
El documento que está visualizando tiene la función primordial de introducirlo a la programación en lenguaje Ensamblador, y está pensado en aquellas personas que nunca han trabajado con este lenguaje y probablemente con ningún otro.
El tutorial se considera como una facilidad ya que el ensamblador basa su funcionamiento en los recursos internos del procesador, los ejemplos descritos no son compatibles con ninguna otra arquitectura.
Se estructura la información en forma de unidades para permitir el fácil acceso a cada uno de los típicos y facilitar el seguimiento del tutorial.
En la sección introductoria se mencionan algunos de los conceptos elementales acerca de los sistemas de cómputo así como del ensamblador mismo, y continúa con el tutorial propiamente dicho.
DEFINICIONES BASICAS
El lenguaje ensamblador, es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, micro controladores, y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria, y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico a cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que, idealmente son portables.
Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.
Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría de los ensambladores modernos incluyen una facilidad de macro (descrita más abajo), y son llamados macro ensambladores.
Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, altos rendimientos, o un uso de recursos controlado y reducido.
Muchos dispositivos programables (como el micro controlador) aún cuentan con el ensamblador como la única manera de ser manipulados.
LENGUAJE DE MÁQUINA
Lenguaje de máquina es el sistema de códigos directamente interpretable por un circuito micro programable, como el microprocesador de una computadora o el micro controlador de un autómata (un PLC) . Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones a ser tomadas por la máquina. Un programa de computadora consiste en una cadena de estas instrucciones de lenguaje de máquina (más los datos). Estas instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el propio programa o eventos externos. El lenguaje de máquina es específico de cada máquina o arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre ellas.
LENGUAJE ENSAMBLADOR
El lenguaje ensamblador, es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, micro controladores, y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria, y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico a cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que, idealmente son portables.
Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.
PROCESAMIENTO DE ENSAMBLADO Este ensamblador es de dos pasadas. Durante la primera pasada, el programa origen se lee para desarrollar la tabla de símbolos.
Durante la segunda pasada el archivo objeto se crea (ensamblado) con referencia a la tabla desarrollada en la primera pasada.
Durante la segunda pasada se crea el listado del programa origen.
Cada enunciado origen se procesa completamente antes de que el enunciado siguiente se lea.
A medida que el enunciado se procesa el ensamblador examina los campos de etiqueta, de código de operación y de operados.
La tabla de códigos de operación se revisa para encontrar un código operacional similar.
Durante el procesamiento de un mnemónico correspondiente a un código de operación normal, el código máquina normal se inserta en el archivo objetivo.
La acción buscada por una directriz del ensamblador ocurre durante el procesamiento de dicha directriz.
Cualquier error que detecta el ensamblador se muestra justamente antes de la línea que contiene dicho error.
Aún y cuando no se desee producir un listado origen, los errores se despliegan para indicar que el procesamiento de ensamblado no se llevó a cabo de manera normal.
VENTAJAS DEL ENSAMBLADOR
La primera razón para trabajar con ensamblador es que proporciona la oportunidad de conocer más a fondo la operación de su PC, lo que permite el desarrollo de software de una manera más consistente.
La segunda razón es el control total de la PC que se tiene con el uso del mismo.
Otra razón es que los programas de ensamblador son más rápidos, más compactos y tienen mayor capacidad que los creados en otros lenguajes.
Por último el ensamblador permite una optimización ideal en los programas tanto en su tamaño como en su ejecución.
ESTRUCTURA DE UN PROGRAMA
La estructura de un programa está conectada con:
Los ficheros de código fuente llevarán la extensión *.ASM
Los ficheros de listado llevarán la extensión *.LST
Los ficheros de código objeto llevarán la extensión *.OB]
Los ficheros de errores llevarán la extensión *.ERR
Los ficheros ejecutables en formato Intel Hex llevarán la extensión *.HEX
Comentario descriptivo del programa (utilizar una cabecera estandarizada).
Definir el micro controlador que se usará (con las directivas LIST e INCLUDE).
Introducir las opciones de compilación (que serán vistas más adelante) (opcional).
Establecer las constantes que se usarán (con la directiva EQU).
Reservar espacios de memoria (directiva RES) (si es necesario).
Configurar los puertos.
Desarrollar el programa con comentarios, en lo posible explicando cada línea de código.
Los mnemónicos escritos en minúscula y las constantes y variables en mayúscula hacen que el código escrito sea más visible.
Colocar las rutinas en el mismo sitio, todas contiguas.
Dibujar diagramas de flujo o escribir seudocódigo.
EJEMPLO 1: ESTRUCTURA DE UN PROGRAMA muy simple:
EJEMPLO 2: POSICION DE LOS ELEMENTOS DEL CODIGO
Etiquetas. Las etiquetas se rigen por las siguientes normas:
Debe situarse en la primera columna.
Debe contener únicamente caracteres alfanuméricos.
El máximo de caracteres es de 31.
Operación. En esta columna se situarán las instrucciones. El campo del código de
operación es el único que nunca puede estar vacío; éste siempre contiene una instrucción o una directiva del ensamblador.
Operandos El campo de operandos o de dirección puede contener una dirección o
un dato, o puede estar en blanco. Normalmente contendrá registroso literales con los que se operará (f, l ok , b y w).
Comentario. El campo del comentario o de etiquetas es opcional. Aquí se situará
cualquier comentario personalizado que deseemos. Estos son útiles para saber qué hace un programa sin tener que descifrar el código entero. El compilador (ensamblador) ignorará todo texto más allá del carácter punto y coma ";".
Los comentarios generalmente se sitúan en la cuarta columna para describir la acción de una línea de código, pero pueden situarse en cualquier parte de programa para describir cualquier otro evento, siempre que estén después del carácter ";" (semiculto en inglés).
Delimitadores (separación entre campos)
Los campos van separados sólo con espacios y/o tabulaciones. No agregue nunca otros caracteres (comas, puntos, etc.)
No utilice espacios extra, particularmente después de comas que separan operandos.(Ej.: movlw 5, w )
No use caracteres delimitadores (espacios y tabulaciones) en nombres o etiquetas.
ESTRUCTURA DE UN LENGUAJE ENSAMBLADOR
CAMPOS DE UNA INSTRUCCIÓN EN ENSAMBLADOR
Etiqueta
Identifica la línea en la cual se encuentra.
Se asocia a la dirección en la cual se encuentra la instrucción o el dato, o a la constante definida.
Recomendaciones
Utilizar sólo letras o números (comenzar por una letra).
Colocar la primera letra de la etiqueta en el primer carácter de la línea.
Nemotécnico
Identifica:
Un código de operación del lenguaje
Una pseudoinstrucción
*Campo de operandos
Identifica los operandos que intervienen en la instrucción o pseudoinstrucción.
Tipos de operandos:
Constantes
Numéricas: decimales (D), binarias (%,B), octales (O,@,Q,C),
Hexadecimales (H,$).
Alfabéticas: entre comillas.
Símbolos
Predefinidos: registros, contador de dirección de ensamblado.
Implícitos: etiquetas de dirección.
Explícitos: mediante pseudoinstrucciones.
Expresiones
Comentarios
Indicaciones para una mejor comprensión del programa ensamblador.
Pueden comenzar con el símbolo “;”.
Estructura y Tecnología de Computadores I
Estructura de un lenguaje ensamblador -3-
PSEUDOINSTRUCCIONES
Manipulación del contador de dirección de ensamblado
Indica la dirección a partir de la cual se localizan los datos o instrucciones acontinuación.
Ej. : ORG operando
Definición de símbolos
Da un valor a un símbolo.
Ej.: ETIQ EQU expresión
Reserva de espacio en memoria (definición de variables)
Con valor inicial: reserva espacio para los datos indicados en la lista deexpresiones, y les pone los valores iniciales indicados (tamaño de cada dato:S=B,W ó L).
Ej. : ETIQ DC.S expr1, expr2,…,exprN
Sin valor inicial: reserva espacio para tantas variables como se indica en laexpresión (tamaño de cada dato: S=B,W ó L).
Ej.: ETIQ DS.S expresión
Control de traducción
Marca el final del programa fuente
Ej.: END
Almacenamiento en posición par
Hace que el siguiente objeto se almacene a partir de la próxima posición dememoria con dirección par.
Ej.: EVEN
Enlace entre programas
Indicación de símbolos externos: EXT, REF, XREF, EXTERNAL.
Indicación de símbolos exportables: ENT, DEF, XDEF, PUBLIC.
Acciones de ensamblado condicional
Incluyen en el ensamblado o no grupos de instrucciones del programa fuente.
Ej.: IF…ELSE… ENDIF
Ejecución de listados e informes
Título para la cabeceras: TITLE, NAME.
Salto de página: PAGE, SPAGE.
Impresión u omisión de parte del programa fuente: LIST, NOLIST.
Inclusión de la tabla de símbolos: SYMBOL, TABLE.
INTRODUCCION BASICA DEL LENGUAJE ENSAMBLADOR
Instrucciones lógicas. Son utilizadas para realizar operaciones lógicas sobre los operando.
AND
Propósito: Realiza la conjunción de los operandos bit por bit.
Sintaxis: AND destino, fuente
Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operando.
El resultado de la operación se almacena en el operando destino.
NEG
Propósito: Genera el complemento a 2
Sintaxis: NEG destino
Esta instrucción genera el complemento a 2 del operando destino y lo almacena en este mismo operando. Por ejemplo, si AX guarda el valor de 1234H, entonces:
NEG AX
Nos dejaría almacenado en el registro AX el valor EDCCH.
NOT
Propósito: Lleva a cabo la negación bit por bit del operando destino.
Sintaxis: NOT destino
El resultado se guarda en el mismo operando destino.
OR
Propósito: OR inclusivo lógico
Sintaxis: OR destino, fuente
La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operados.
TEST
Propósito: Comparar lógicamente los operandos
Sintaxis: TEST destino, fuente
Realiza una conjunción, bit por bit, de los operandos, pero a diferencia de AND esta instrucción no coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas.
XOR
Propósito: OR exclusivo
Sintaxis: XOR destino, fuente
Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.
Instrucciones aritméticas. Se usan para realizar operaciones aritméticas sobre los operando.
ADC
Propósito: Adición con acarreo.
Sintaxis: ADC destino, fuente
Lleva a cabo la suma de dos operandos y suma uno al resultado en caso de que la bandera CF esté activada, esto es, en caso de que exista acarreo.
El resultado se guarda en el operando destino.
ADD
Propósito: Adición de los operandos.
Sintaxis: ADD destino, fuente
Suma los dos operandos y guarda el resultado en el operando destino.
DIV
Propósito: División sin signo
Sintaxis: DIV fuente
El divisor puede ser un byte o palabra y es el operando que se le da a la instrucción.
Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par DX: AX, tomando como palabra alta DX y como baja AX.
Si el divisor fue un byte el cociente se almacena en el registro AL y el residuo en AH, si fue una palabra el cociente se guarda en AX y el residuo en DX.
IDIV
Propósito: División con signo
Sintaxis: IDIV fuente
Consiste básicamente en lo mismo que la instrucción DIV, solo que esta última realiza la operación con signo.
Para sus resultados utiliza los mismos registros que la instrucción DIV.
MUL
Propósito: Multiplicación sin signo
Sintaxis: MUL fuente
El ensamblador asume que el multiplicando será del mismo tamaño que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.
Cuando se realiza una multiplicación con valores de 8 bits el resultado se almacena en el registro AX y cuando la multiplicación es con valores de 16 bits el resultado se almacena en el registro par DX: AX.
IMUL
Propósito: Multiplicación de dos enteros con signo.
Sintaxis: IMUL fuente
Este comando hace lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades que se multiplican.
Los resultados se guardan en los mismos registros que en la instrucción MUL.
SBB
Propósito: Substracción con acarreo
Sintaxis: SBB destino, fuente
Esta instrucción resta los operandos y resta uno al resultado si CF está activada. El operando fuente siempre se resta del destino.
Este tipo de substracción se utiliza cuando se trabaja con cantidades de 32 bits.
SUB
Propósito: Substracción
Sintaxis: SUB destino, fuente
Resta el operando fuente del destino.
EJERCICIOS:
SUMA, RESTA, MULTIPLICACION, DIVISION.
SUMAR NUMEROS EN LENGUAJE ENSAMBLOR
.model small
.stack
.data var1 db ?.code.startup
mov ah,01hint 21h
sub al,30hmov var1,al
mov ah,01hint 21hsub al,30hadd al,var1
mov dl,aladd dl,30hmov ah,02h
int 21h.exitEnd
RESTAR NUMEROS EN LENGUAJE ENSAMBLADOR
.model small
.stack
.data var1 db ?.code.startupmov ah,01hint 21hsub al,30hmov var1,al
mov ah,01hint 21hsub al,30hsub al,var1mov dl,aladd dl,30hmov ah,02hint 21h.exitend
MULTIPLICACION DE LENGUAJE ENSAMBLADOR
.model small
.stack
.data
var1 db ?.code.startup
mov ah,01hint 21hsub al,30hmov var1,al
mov ah,01hint 21hsub al,30hmul byte ptr [var1]
mov dl,aladd dl,30hmov ah,02hint 21h
.exitEnd
DIVISION DE LENGUAJE ENSAMBLADOR
invokewrite, addr num1 ;mensaje del primer valor call leer ;lee un numeromovEbx,numero ;muevo al a bl invokewrite, addrsaltinvokewrite, addr num2 ;mensaje del segundo valor
call leer ;lee un numeromovEax,EbxmovEbx,numerodiv Ebx ;sumo bl / almovnumero,Eax ;respaldomovEbx,Edx invokewrite, addrsalt
invokewrite, addr res ;mensaje del resultado
call mostrar ;muestra el resultado
invokewrite, addrresi;mensaje de residuo
movnumero,Ebxcall mostrar ;muestra el residuo
callreadc ;espero a que presione tecla
jmp repite
LINKOGRAFIAhttp://es.wikipedia.org/wiki/Compilador
http://usuarios.multimania.es/patricio/ensam/ensam1.htm
http://www.pro-gramas.com/scripts/Calculadora-de-32bits-suma,-resta,-multiplica,-divide-en-ensamblador-43-26.html
http://www.monografias.com/trabajos76/estructura-programa-ensamblador/estructura-programa-ensamblador.shtml