Lenguaje ensamblador

31
ESTUDIANTES: DARWIN RODOLFO DÁVILA FERNÁNDEZ. JOSE LUIS CARRASCO RODAS. KENEDY DE LA CRUZ LOPEZ. LENGUAJE ENSAMBLADOR

Transcript of Lenguaje ensamblador

Page 1: Lenguaje ensamblador

ESTUDIANTES: DARWIN RODOLFO DÁVILA FERNÁNDEZ.

JOSE LUIS CARRASCO RODAS.

KENEDY DE LA CRUZ LOPEZ.

LENGUAJE ENSAMBLADOR

Page 2: Lenguaje ensamblador

Es un lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que representan instrucciones básicas para los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de la máquina binaria y otras constantes necesarias para programar una arquitectura de procesador y constituye la representación más directa del código específico para cada arquitectura legible por un programador.

DEFINICIÓN

Page 3: Lenguaje ensamblador

Cada arquitectura de procesador tiene su propio lenguaje ensamblador que usualmente es 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 de 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 portátiles.

Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo.

Page 4: Lenguaje ensamblador

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 se llaman macro ensambladores.

Page 5: Lenguaje ensamblador

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, alto rendimiento, o un uso de recursos controlado y reducido.

También es utilizado en el desarrollo de controladores de dispositivo (en inglés, device drivers) y en el desarrollo de sistemas operativos, debido a la necesidad del acceso directo a las instrucciones de la máquina. Muchos dispositivos programables (como los microcontroladores) aún cuentan con el ensamblador como la única manera de ser manipulados.

Page 6: Lenguaje ensamblador

CARACTERISTICAS

Page 7: Lenguaje 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. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.

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) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.

Page 8: Lenguaje ensamblador

Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.

También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecución.

Page 9: Lenguaje ensamblador

VENTAJAS

Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el más cercano a la máquina la computadora lo procesa más rápido.

Eficiencia de tamaño: Un programa en

ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan librerías y demás como son los lenguajes de alto nivel.

Flexibilidad porque 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.

Page 10: Lenguaje ensamblador

DESVENTAJAS Tiempo de programación: Como es un

lenguaje de bajo nivel requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel.

Programas fuente grandes: Por las mismas razones que aumenta el tiempo, crecen los programas fuentes, simplemente requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.

Page 11: Lenguaje ensamblador

Peligro de afectar recursos inesperadamente: Que todo error que podamos cometer, o todo riesgo que podamos tener, podemos afectar los recursos de la máquina, programar en este lenguaje lo más común que pueda pasar es que la máquina se bloquee o se reinicie.

Falta de portabilidad: Porque para cada máquina existe un lenguaje ensamblador, 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.

Page 12: Lenguaje ensamblador

USO DEL LENGUAJE ENSAMBLADOR

Page 13: Lenguaje ensamblador

Para programas empotrados que solo almacenan una pequeña cantidad de memoria y el dispositivo está dirigido para hacer tareas para un simple propósito. Ejemplos consisten en teléfonos, sistemas de combustible e ignición para automóviles, sistemas de control del aire acondicionado, sistemas de seguridad, y sensores interactuando directamente con el hardware, por ejemplo en drivers de dispositivo y manejadores de interrupción.

Usando instrucciones específicas del procesador no explotadas o disponibles por el compilador.

Los programadores de juegos toman ventaja de las habilidades de las características del hardware en los sistemas, permitiendo a los juegos correr más rápidamente.

Page 14: Lenguaje ensamblador

Un sistema con severas limitaciones de recursos debe ser codificado a mano para maximizar el uso de los limitados recursos

Se escriben virus de computadora, bootloaders, ciertos drivers de dispositivo, u otros elementos muy cerca del hardware o al sistema operativo de bajo nivel.

Se escribe software compilador que genera código ensamblador, y por lo tanto los desarrolladores deben ser programadores de lenguaje ensamblador.

Page 15: Lenguaje ensamblador

Se escriben algoritmos criptográficos que siempre deben tomar estrictamente el mismo tiempo para ejecutar, previniendo ataques de tiempo.

Se escriben simuladores del conjunto de instrucciones para monitoreo, trazado y depuración de errores donde la sobrecarga adicional es mantenida al mínimo

Se hace ingeniería inversa en binarios existentes que pueden o no haber sido escritos originalmente en un lenguaje de alto nivel, por ejemplo al crackear la protección anticopia del software propietario.

Page 16: Lenguaje ensamblador

Los programas escritos en lenguaje ensamblador deben pasar por una fase donde se “traducen” a lenguaje máquina o lenguaje binario para que el computador o microcomputador lo ejecute directamente, esta tarea la realiza un software especializado llamado “programa ensamblador”.

El proceso de crear un programa se divide en tres partes:

1. Editar el programa, en su formato fuente.2. Ensamblarlo y enlazarlo3. Realizar las correcciones y depuraciones necesarias, el ciclo se

puede cerrar en esta parte para comenzar de nuevo en la primera.

PROGRAMA EN ENSAMBLADOR

Page 17: Lenguaje ensamblador

Código fuente: Es el conjunto de líneas de texto que representan las instrucciones que debe seguir la CPU para ejecutar el programa, este código describe completamente el funcionamiento del programa, aunque no es directamente ejecutable teniendo que pasar por un compilador para ser traducido a lenguaje maquina o código objeto.

Código objeto: El código objeto es el resultado de la compilación del código fuente, consiste en lenguaje máquina que puede estar distribuido en varios archivos correspondientes a varios códigos fuente que son enlazados con un programa “enlazador” o “linker” para producir el programa ejecutable.

Código ejecutable: Es un empaquetado listo para ser ejecutado en una computadora, generalmente tiene la extensión “.COM” o “.EXE”, es el resultado de la compilación y el enlazamiento “linker” de los códigos objetos.

Page 18: Lenguaje ensamblador

INSTRUCCIONES

Page 19: Lenguaje ensamblador

Instrucciones aritméticas Se usan para realizar operaciones aritméticas sobre los operandos.

Page 20: Lenguaje ensamblador

ADC: 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.

ADD: Suma los dos operandos y guarda el resultado en el operando destino.

DIV: El divisor puede ser un byte o palabra y es el operando que se le da a la instrucción.

IDIV: Consiste básicamente en lo mismo que la instrucción DIV, solo que esta última realiza la operación con signo.

Page 21: Lenguaje ensamblador

MUL: 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.

IMUL: Este comando hace lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades que se multiplican.

SBB: Esta instrucción resta los operandos y resta uno al resultado si CF está activada. El operando fuente siempre se resta del destino.

SUB: Resta el operando fuente del destino.

Page 22: Lenguaje ensamblador

Instrucciones Lógicas Son utilizadas para realizar operaciones lógicas sobre los operandos.

Page 23: Lenguaje ensamblador

AND: Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operandos

NEG: Esta instrucción genera el complemento a 2 del operando destino y lo almacena en este mismo operando.

NOT: Lleva a cabo la negación bit por bit del operando destino.

OR: Lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos

TEST: 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: Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.

Page 24: Lenguaje ensamblador

Instrucciones de transferencia: Son utilizadas para mover los contenidos de los operandos. Cada instrucción se puede usar con diferentes modos de direccionamiento.

MOV: Transferencia de datos entre celdas de memoria, registros y acumulador.

MOVS (MOVSB) (MOVSW): Mover cadenas de bytes o palabras desde la fuente, direccionada por SI, hasta el destino direccionado por DI.

Page 25: Lenguaje ensamblador

Instrucciones de cargaSon instrucciones específicas de los registros. Son usadas para

cargar en algún registro bytes o cadenas de bytes.

Page 26: Lenguaje ensamblador

LODS (LODSB) (LODSW): Esta instrucción toma la cadena que se encuentre en la dirección especificada por SI, la carga al registro AL (o AX) y suma o resta 1 (según el estado de DF) a SI si la transferencia es de bytes o 2 si la transferencia es de palabras.

LAHF: Esta instrucción es útil para verificar el estado de las banderas durante la ejecución de nuestro programa.

Page 27: Lenguaje ensamblador

LDS: El operando fuente debe ser una palabra doble en memoria. La palabra asociada con la dirección más grande es transferida a DS, o sea que se toma como la dirección del segmento. La palabra asociada con la dirección menor es la dirección del desplazamiento y se deposita en el registro señalado como destino.

LEA: El operando fuente debe estar ubicado en memoria, y se coloca su desplazamiento en el registro índice o apuntador especificado en destino.

LES: El operando fuente debe ser un operando en memoria de palabra doble. El contenido de la palabra con la dirección mayor se interpreta como la dirección del segmento y se coloca en ES. La palabra con la dirección menor es la dirección del desplazamiento y se coloca en el registro especificado en el parámetro destino.

Page 28: Lenguaje ensamblador

Instrucciones de la pila Permiten el uso de la pila para almacenar y extraer datos.

Page 29: Lenguaje ensamblador

POP: Esta instrucción transfiere el último valor almacenado en la pila al operando destino, después incrementa en dos el registro SP.

POPF: Este comando transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de banderas.

PUSH: La instrucción PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando fuente a la nueva dirección resultante en el registro recién modificado.

PUSHF: Este comando decrementa en 2 el valor del registro SP y luego se transfiere el contenido del registro de banderas a la pila, en la dirección indicada por SP.

Page 30: Lenguaje ensamblador

Registros de uso general AX: Acumulador (AL: AH) BX: Registro base (BL: BH) CX: Registro contador (CL: CH) DX: Registro de datos (DL: DH)

Registros de segmento DS: Registro del segmento de datos. ES: Registro del segmento extra. SS: Registro del segmento de pila. CS: Registro del segmento de código.

Registros punteros BP: Registro de apuntadores

base. SI: Registro índice fuente. DI: Registro índice destino.

Registros especiales SP: Registro apuntador de la pila. IP: Registro apuntador de la siguiente

instrucción F: Registro de banderas (8 bits).

Registros de CPU

Page 31: Lenguaje ensamblador

Bits del registro de banderas

Overflow NV (Apagado): No hay desbordamiento OV (Encendido): Si lo hay

Direction UP: Hacia adelante DN: Hacia atrás

Interrupts DI: Desactivadas EI: Activadas

Sign PL: Positivo NG: Negativo

Zero NZ: No es cero ZR: Si lo es

Auxiliary carry NA: No hay acarreo auxiliar AC: Hay acarreo auxiliar

Parity PO: Impar PE: Paridad par

Carry NC: No hay acarreo CY: Si lo hay