Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

ENSAMBLADORES

No description
by

Carlos Valdez

on 23 April 2014

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of ENSAMBLADORES

El formato básico de una sentencia en lenguaje ensamblador es:
ENSAMBLADORES
Funciones y características de un ensamblador
Diseño de un ensamblador
El lenguaje de máquina y el lenguaje humano: Necesidad de un traductor
El lenguaje máquina es el único que entiende la computadora digital. En él sólo se pueden utilizar dos símbolos: 0 y 1. Por ello al lenguaje máquina también se le denomina lenguaje binario. La computadora sólo puede trabajar con bits.
Sin embargo, existen lenguajes que permiten al programador escribir instrucciones de un programa usando abreviaturas del inglés llamadas nemotécnicas, tales como: ADD, DIV, SUB, etc.
Un programa escrito en lenguaje ensamblador tiene el inconveniente de que no es comprensible para la computadora, ya que no está compuesto por ceros y unos.
Para traducir las instrucciones de un lenguaje escrito en lenguaje ensamblador a instrucciones de un lenguaje máquina hay que utilizar un programa llamado
ensamblador
. Se denomina de igual forma al lenguaje que al traductor.
Por ejemplo, en el lenguaje ensamblador para un procesador x86 la sentencia:

MOV AL,61H

Asigna el valor hexadecimal 61 (97 decimal) al registro AL.

El programa ensamblador lee la sentencia y produce su equivalente binario en lenguaje máquina:
10110000 01100001
El código de máquina generado por el ensamblador consta de 2 bytes. El primer byte contiene empaquetada la instrucción MOV y el código del registro hacia donde se va a mover el dato.
En el segundo byte se especifica el número 61h, escrito en binario como 01100001, que se asignará al registro AL, quedando así una sentencia que podrá ser entendida y ejecutada directamente por el procesador.
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, y son llamados macro ensambladores.
Características de un lenguaje simbólico
El lenguaje simbólico constituye la representación más directa del código máquina específico para cada arquitectura de computadoras y es legible para un programador. Un programa escrito en lenguaje simbólico consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de un sistema basado en microprocesador.
Los lenguajes simbólicos utilizan caracteres naturales para escribir las instrucciones de los programas. Los lenguajes simbólicos se dividen a su vez en:
Lenguajes simbólicos de bajo nivel o ensambladores.
Lenguajes simbólicos de alto nivel.
A medida que se va subiendo de nivel, los lenguajes son más sencillos y más productivos en desarrollo, pero en contra partida son menos eficientes a la hora de su ejecución.
Los programas escritos en lenguajes simbólicos se denominan programas fuente y los programas no son directamente ejecutables; su ejecución implica su previa traducción a código máquina para obtener los denominados programas objeto o absolutos. Esta traducción se hace a través de los ensambladores, compiladores o intérpretes.
Ventajas y desventajas
Una vez que hemos visto la evolución de los lenguajes, cabe preguntarse: ¿En tiempos "modernos", donde las facilidades de programación están bastante desarrolladas, para qué quiero el Lenguaje Ensamblador?

El proceso de evolución trajo consigo algunas desventajas, que ahora veremos como las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel:

Velocidad
Eficiencia de tamaño
Flexibilidad

Por otro lado, al ser un lenguaje más primitivo, el Ensamblador tiene ciertas desventajas respecto a los lenguajes de alto nivel:

Tiempo de programación
Programas fuente grandes
Peligro de afectar recursos inesperadamente
Falta de portabilidad
Como el programador directamente selecciona las instrucciones que se ejecutan en el programa, el programa final queda más optimizado que un programa generado por un compilador.

Para darnos idea , en una PC, suponiendo que todos son buenos programadores, un programa para ordenar una lista tardará 20 veces más en Visual Basic (un intérprete) y 2 veces más en C (un compilador), que el equivalente en Ensamblador.

Por ello cuando es crítica la velocidad del programa, el Ensamblador se vuelve un candidato lógico como lenguaje.
Velocidad
Tamaño
Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso de memoria tenemos a los manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador.
Flexibilidad
La flexibilidad consiste en reconocer el hecho de que:
Todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitante para explotar al máximo los recursos de la máquina.
Tiempo de programación
Al ser de bajo nivel, el lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica más fuertemente en la ejecución.
Ensambladores de una y dos pasadas
Instrucciones
El procesador tiene un conjunto de instrucciones bastante amplio. Todas las instrucciones tienes un propósito especifico, y es por ello que se categorizan en diferentes tipos de instrucciones
Tablas de simbolos
El proceso de ensamble empieza por la lectura secuencian de cada línea del programa y su “particionamiento” en tokens.
Los tokens simplemente son secuencias de caracteres separadas por un símbolo específico (puede ser un espacio, una coma o cualquier símbolo definido por ensamblador)
Contador de localidades
Para llevar una cuenta de las posiciones relativas a un segmento de datos o de código, el ensamblador utiliza un contador de localidades. Al inicio, el contador es puesto en 0. Con cada instrucción, el contador se incrementa en la cantidad correspondiente al tamaño de la instrucción.
MOV AX, Valor_2
ORG expresión
• Instrucciones de transferencia: Son utilizadas para mover los contenidos de los operandos. Cada instrucción se puede usar con diferentes modos de direccionamiento.
MOV
MOVS (MOVSB) (MOVSW)
• Instrucciones de carga: Son instrucciones específicas de los registros. Son usadas para cargar en algún registro bytes o cadenas de bytes.
LODS (LODSB) (LODSW)
LAHF
LDS
LEA
LES
• Instrucciones de la pila: Estas instrucciones permiten el uso de la pila para almacenar y extraer datos.
POP
POPF
PUSH
PUSHF
• Instrucciones lógicas: Son utilizadas para realizar operaciones lógicas sobre los operandos.
• Instrucciones de conteo: Se utilizan para decrementar o incrementar el contenido de los contadores.
DEC
INC
AND
NEG
NOT

• Instrucciones para ciclos: LOOP Transfieren el flujo del proceso, condicional o incondicionalmente, a un destino repitiéndose esta acción hasta que el contador sea cero.
LOOP
LOOPE
LOOPNE
• Instrucciones de banderas: Afectan directamente al contenido de las banderas.
CLC
CLD
CLI
• Instrucciones de comparación: Son usadas para comparar operandos, afectan al contenido de las banderas.
CMP
CMPS (CMPSB) (CMPSW)
• Instrucciones aritméticas: Se usan para realizar operaciones aritméticas sobre los operandos.
ADC
ADD
DIV
IDIV

MUL
IMUL
SBB
SUB
OR
TEST
XOR
• Instrucciones de salto: Son utilizadas para transferir el flujo del proceso al operando indicado.
JMP
JA (JNBE)
JAE (JNBE)
JB (JNAE)
JBE (JNA)
JE (JZ)
JNE (JNZ)
JG (JNLE)
JGE (JNL)
JL (JNGE)
JLE (JNG)
JC
JNC
JNO
JNP (JPO)
JNS
JO
JP (JPE)
JS
CMC
STC
STD
STI
Cuando el ensamblador los procesa, primero comprueba si el token se encuentra en una lista reservada de palabras (la cual a su vez contiene tokens que tienen algún significado especial para el ensamblador). Dentro de esta lista se encuentran las instrucciones directas del procesador, los registros y algunas otras palabras clave.
Si no lo encuentra en su lista de palabras reservadas, entonces lo busca en su tabla de símbolos. Al no encontrarlo en la tabla supone que usted lo definirá mas adelante y lo inserta como un símbolo no definido. En caso de encontrarlo en la tabla, usa la dirección que le corresponde para decodificar y armar la instrucción
La Tabla de Símbolos asocia una palabra entendida por humanos con una posición de memoria en hexadecimal. De modo que a la hora de ensamblar el código, todos los lugares en los que se encuentra dicha palabra la cambia por su respectiva posición de memoria. Esto es bueno, pues a medida de que escribimos un código, dichas posiciones van cambiando de lugar. El nombre de una variable es un símbolo.
Directivas
Los directivas del ensamblador, también llamadas los pseudo opcodes, pseudo-operaciones o pseudo-ops, son órdenes para el ensamblador y no tienen traducción a código máquina. Son ejecutadas por un ensamblador en el tiempo de ensamblado, no por un CPU en el tiempo de ejecución. Pueden hacer al ensamblado del programa dependiente de parámetros entrados por un programador, de modo que un programa pueda ser ensamblado de diferentes maneras. También pueden ser usadas para manipular la presentación de un programa para hacerlo más fácil leer y mantener.
• Definición de símbolos
etiqueta EQU valor
nombre = expresión

Definición de datos
: Ubica memoria para un ítem de datos y opcionalmente asocia un nombre simbólico con esa dirección de memoria o genera el valor inicial para ese ítem.
[nombre] DB valor_inicial [, valor_inicial...]
[nombre] DW valor_inicial [, valor_inicial...]
[nombre] DD valor_inicial [, valor_inicial...]
• Definición de segmentos:
Organizan el programa para utilizar los segmentos de memoria del microprocesador. Estos son SEGMENT, ENDS, DOSSEG, ASSUME, GROUP.
nombre_segm SEGMENT [alineación][combinación]['clase']
sentencias
nombre_segm ENDS
• Control del ensamblador
ORG expresión
EVEN
END [etiqueta]
• Definición de procedimientos:
Los procedimientos son secciones de código que se pueden llamar para su ejecución desde distintas partes del programa.
etiqueta PROC {NEAR|FAR}
sentencias
etiqueta ENDP
• Ensamblado condicional Verifican una condición determinada y si se cumple, ensambla una porción de código. Opcionalmente puede ensamblarse otra porción de código si la condición no se cumple.
IF, IF1, IF2, IFB, IFDEF, IFDIF, IFE, IFIDN, IFNB, IFNDEF, ENDIF, ELSE.
• Definición de macros:
Las macros asignan un nombre simbólico a un bloque de sentencias fuente. Luego se puede usar dicho nombre para representar esas sentencias. Opcionalmente se pueden definir parámetros para representar argumentos para la macro.
nombre_macro MACRO [parámetro [,parámetro...]]
[LOCAL nombre_local[,nombre_local...]
sentencias
ENDM
• Definición de bloques de repetición:
Son tres: REPT, IRP e IRPC. Como en el caso de la directiva MACRO, se puede incluir la sentencias LOCAL y EXITM y deben terminarse con la directiva ENDM.
REPT expresión
sentencias
ENDM
IRP parámetro, <argumento [,argumento...]>
sentencias
ENDM
• Referencias externas al módulo
: Sirve para poder particionar un programa en varios archivos fuentes o módulos. Son imprescindibles si se hace un programa en alto nivel con procedimientos en assembler.
PUBLIC nombre[, nombre...]:
EXTRN nombre:tipo [,nombre:tipo...]:
INCLUDE nombre_de_archivo
• Segmentos simplificados: Permite definir los segmentos sin necesidad de utilizar las directivas de segmentos que aparecen más arriba.
.MODEL modelo
.STACK [size]
.CODE [name]
.DATA
.DATA?
.FARDATA? [name]
.FARDATA [name]
.CONST
Ensambladores de
una pasada
Ensambladores de
dos pasadas
Funciones de un ensamblador
CANTIDADES ABSOLUTAS
VALORES GLOBALES (EXTERNOS)
VARIABLES LOCALES, O LOCALIZABLES (INTERNAS)
Tipos de información en el programa fuente
Conversiones
La función principal del ensamblador es: Traducir el código fuente (instrucciones nemónicas a código máquina). Y como ya se sabe, este código generado recibe el nombre de código objeto.
PERO PARA ELLO, DEBE REALIZAR LO SIGUIENTE:
Primer Pasada
Segunda Pasada
Construcción de instrucciones en un formato válido y adecuado
Escritura del .obj
Editor de encadenamiento o cargador.
¡AQUI ES IMPORTANTE RESALTAR, QUE YA SE HA CREADO NUESTRA TABLA DE SÍMBOLOS!
Características de un ensamblador
El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina distinta.
Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM).
Programas fuente grandes
Por las mismas razones que aumenta el tiempo, crecen los programas fuente; simplemente, requerimos más instrucciones primitivas para describir procesos equivalentes.
Peligro de afectar recursos inesperadamente
Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener mucho poder es útil pero también es peligroso.
Falta de portabilidad
Como ya se mencionó, existe un lenguaje ensamblador para cada máquina; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras.
Salida en Binario
Salida en Simbólico- Binario
Tipo "Load and Go",
Usa el símbolo antes de definirlo
Necesidad del Cargador para la completa traducción
a=2; c=a+b;
b=3;
El tiempo de proceso de las referencias cruzadas o parámetros de ensamblaje es prácticamente proporcional al cuadrado del número de instrucciones del programa. Por lo que es eficaz dividir el programa.
Estos ensambladores hacen de forma automática las subrutinas de biblioteca y realizan su enlazamiento.
El primer paso de un ensamblador tiene por misión principal la del análisis de las sentencias o instrucciones ,detecta posibles errores.
 Leer sentencia o instrucción.
 Analizar sentencia o instrucción.
 Tratamiento de etiquetas.
 Buscar en tabla de símbolos (si no está́, pasar al siguiente paso).
 Insertar en tabla de símbolos.
 Tratamiento de código de operación.
 Buscar en tabla de código de operación y actualizar campo de dirección.
 Escribir código de operación.
 Buscar en tabla de pseudo- instrucciones y hacer el tratamiento de la pseudo-instrucción.
 Análisis del operando (en caso de la creación de un código intermedio).
 Almacenar en tabla de símbolos.
 Buscar en tabla de símbolos.
 Sustituir por dirección en tabla de símbolos.

SUBRUTINA
(Evalúa y completa
valores que faltaron)
El objetivo de este paso es obtener una visión semi-compilada (simbólica-binaria del programa o rutina que se está́ ensamblando), además de las tablas de uso para el cargador y la información necesaria para la localización de las variables.
 Lectura del programa de memoria secundaria.
 Tratamiento de sentencias o instrucciones. En el primer paso solo se analizaban las sentencias para ver si eran correctas.
 Tratamiento del código de operación (SEGUNDO PASO). En el primer paso el código de operación se trataba simplemente para ver si era correcto o no.
 Buscar en tabla de código de operación. Obtener código de máquina y su longitud. o Actualizar contador de direcciones.
 Buscar tabla de pseudo-instrucción (si es símbolo). Tratar la pseudo- instrucción.
 Tratamiento del operando.
Buscar en tabla de símbolo (si es símbolo). Obtener la dirección.
 Obtener valor (si no es símbolo se obtiene la dirección directamente).
 Escribir código objeto
Full transcript