Lenguaje ensamblador basico

26
Lenguaje ensamblador

Transcript of Lenguaje ensamblador basico

Page 1: Lenguaje ensamblador basico

Lenguaje ensamblador

Page 2: Lenguaje ensamblador basico

Que es? El ensamblador es una variante legible para el ser humano del lenguaje de maquina que usan las computadoras. Este lenguaje le da la facilidad y las herramientas necesarias para tomar el control de todo el PC. El lenguaje ensamblador, o assembler (assembly language en inglés) es un lenguaje de programación de bajo nivel para los computadores, y otros circuitos integrados programables. El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina,

Page 3: Lenguaje ensamblador basico

Se dice que existe una relación 1:1 entre el lenguaje de maquina y el lenguaje ensamblador. Por tanto, El Lenguaje Ensamblador es directamente traducible al Lenguaje de Máquina, y viceversa.

Por otro lado, la computadora no entiende directamente al Lenguaje Ensamblador; es necesario traducirle a Lenguaje de Máquina.

Cuando creamos un programa en assembler, la extensión del programa lo guardamos como ASM. Este archivo no lo entiende la Pc, por tanto se hace necesario traducir el programa para obtener un OBJ, este último archivo “obj” contiene lenguaje de maquina que si puede interpretar el ordenador.

Cabe resaltar que el lenguaje assembler va a depender del hardware. Es decir, para la arquitectura de la familia Intel, el lenguaje ensamblador cambiará con respecto a la arquitectura de la familia motorola.

Que es?

Page 4: Lenguaje ensamblador basico

Ventajas del lenguaje ensamblador? Proporciona un control absoluto sobre la PC. Permite implementar software o hardware de una manera más consciente. Sabemos el porque y el para que.

Se conserva el control total de lo que debe hacer el PC, siempre y cuando sea físicamente capaz de hacer o ejecutar la tarea.

Los programas creados en lenguaje ensamblador son más compactos y sobre todo más rápidos en comparación con otros lenguajes de alto nivel.

Para un programa que muestre la cadena “Hola, mundo !!!!”

Lenguaje Fuente Objeto Ejecutable (.exe)

Basic 27 bytes 651 bytes 12814 bytes

Ensamblador 162 bytes 169 bytes 543 bytes

Page 5: Lenguaje ensamblador basico

Estructura De Un Programa En Ensamblador

Un programa en el lenguaje ensamblador consiste de una secuencia de proposiciones, una en cada línea del código fuente. La sintaxis de una proposición es la siguiente: [etiqueta] [instrucción|directiva [operandos]] [;comentario] donde etiqueta, instrucción|directiva, operandos, comentario son los campos de la proposición. Los campos se separan por caracteres blancos: caracteres de espacio y/o de tabulación. Todos los campos son opcionales, pero el campo operandos sólo pueden estar presente si existe el campo instrucción|directiva. etiqueta es un nombre simbólico empleado para referirse a números, cadenas de caracteres o localidades de memoria dentro de un programa. Las etiquetas permiten darle nombre a las variables, constantes y localidades de una instrucción particular. Inicio: mov ds,ax ; comentario

Page 6: Lenguaje ensamblador basico

Estructura De Un Programa En Ensamblador Un programa en el lenguaje ensamblador consiste de una secuencia de proposiciones, una en cada línea del código fuente. La sintaxis de una proposición es la siguiente: [etiqueta] [instrucción|directiva [operandos]] [;comentario] donde etiqueta, instrucción|directiva, operandos, comentario son los campos de la proposición. Los campos se separan por caracteres blancos: caracteres de espacio y/o de tabulación. Todos los campos son opcionales, pero el campo operandos sólo pueden estar presente si existe el campo instrucción|directiva. etiqueta es un nombre simbólico empleado para referirse a números, cadenas de caracteres o localidades de memoria dentro de un programa. Las etiquetas permiten darle nombre a las variables, constantes y localidades de una instrucción particular. instrucción es un mnemónico de una instrucción del procesador. Cada instrucción se traduce directamente a una instrucción del lenguaje máquina del microprocesador. Operandos consiste de cero, uno o más operandos. Un operando le especifica al ensamblador qué valor, registro, localidad de memoria, etc., asociar con cada instrucción.

operandos consiste de cero, uno o más operandos. Un operando le especifica al ensamblador qué

valor, registro, localidad de memoria, etc., asociar con cada instrucción. Inicio: mov ds,ax ; comentario

Page 7: Lenguaje ensamblador basico

Palabras Reservadas

Las palabras reservadas son para uso estricto del ensamblador. Éstas incluyen a los operadores, directivas y símbolos predefinidos. Estas palabras no pueden usarse como identificadores. Algunas de ellas son

Page 8: Lenguaje ensamblador basico

Inicio de un programa en ensamblador para el 8086

model : Esta es una directiva, que selecciona uno de los 6 modos diferentes

que tiene Turbo Assenbler de generar el código de un programa dependiendo del tamaño que tiene el código y los datos. Los seis modelos son Pequeñito (tiny), pequeño (small), medio (medium), compacto (compact),

grande (large) y extenso (huge).

stack

Esta directiva reserva espacio de memoria para la pila del programa, un área de memoria que almacena valores temporales empleados por las subrutinas y las direcciones de regreso de las subrutinas.

Page 9: Lenguaje ensamblador basico

Inicio de un programa en ensamblador para el 8086

Variables del programa

Las variables de un programa se declaran en el segmento de datos, por lo que la sección de declaración de variables empieza con la directiva dataseg. Esta directiva le indica a Turbo Assembler que almacene las variables en el segmento de datos del programa. Las variables pueden estar inicializadas o no. Los valores de las variables inicializadas se almacenan en el código del programa y se cargan en las variables al ejecutar el programa.

Para declarar variables podemos utilizar las directivas db, dw, dd o dq. La directiva db define una variable de un byte, la directiva dw define una variable de tipo palabra (dos bytes), la directiva dd define una variable de tipo palabra doble (cuatro bytes) y la directiva dq define una variable de tipo

palabra cuádruple (ocho bytes). La sintaxis de estas directivas son: nomVar db exp

nomVar dw exp

nomVar dd exp

nomVar dq exp

Page 10: Lenguaje ensamblador basico

Ejemplo de Codigo assembler .model small

.data

mens db 'hola que tal!.$'

.stack

.code

EMP:

mov ax,@data

mov ds,ax

mov dx,offset mens

mov ah,9

int 21h

mov ah,4ch

int 21h

end EMP

Page 11: Lenguaje ensamblador basico

Registros del Micro-8086

En total maneja 14 registros distribuidos de la siguiente manera:

Registro de propósito general

AX (16 bits): El registro AX es el registro acumulador, es utilizado para operaciones que implican

entrada/salida y la mayor parte de la aritmética.

AL (8 bits)

AH (8 bits)

BX (16 bits): El registro BX es el registro base, y es el único registro de propósito general que

puede ser un índice para direccionamiento indexado. También es común emplear el BX para cálculos.

BL (8 bits)

BH (8 bits)

CX (16 bits): El registro CX es conocido como el registro contador. Puede contener un valor para

controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits. CL (8 bits)

CH (8 bits)

DX (16 bits): El registro DX es el registro de datos. Algunas operaciones de entrada/salida

requieren su pulso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y AX

trabajando juntos.

DL (8 bits)

DH (8 bits)

Page 12: Lenguaje ensamblador basico

Registros del Micro-8086 Continuación…

En total maneja 14 registros distribuidos de la siguiente manera:

Registro de índice

SI: El registro índice fuente u origen de 16 bits es requerido por algunas

operaciones con cadenas de caracteres. El SI está asociado con el registro DS. Índice origen

DI: El registro índice destino también es requerido por algunas operaciones con

cadenas de caracteres. El DI está asociado con el registro ES. Índice destino

BP: El apuntador base de 16 bits facilita la referencia de parámetros, los cuales

son datos y direcciones transmitidos vía la pila. Puntero a base

SP: El apuntador de pila de 16 bits está asociado con el registro SS y proporciona

un valor de desplazamiento que se refiere a la palabra actual que está siendo procesada en la pila. El sistema maneja de manera automática este registro.

Puntero de pila

Page 13: Lenguaje ensamblador basico

Registros del Micro-8086 Continuación…

En total maneja 14 registros distribuidos de la siguiente manera:

Registro de Segmento

CS: El DOS almacena la dirección inicial del segmento de código de un programa en el

registro CS. Segmento de código

DS: La dirección inicial de un segmento de datos de programa es almacenada en el registro

DS. Segmento de dato

ES: Algunas operaciones con cadenas de caracteres utilizan el registro extra de segmento

para manejar el direccionamiento de memoria. Segmento Extra

SS: El registro SS permite la colocación en memoria de una pila, para almacenamiento

temporal de direcciones y datos.

Segmento de pila

Page 14: Lenguaje ensamblador basico

Registros del Micro-8086 Continuación…

En total maneja 14 registros distribuidos de la siguiente manera:

IP: El registro IP de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta

Registro apuntador de instrucciones

IP Apuntador de instrucciones

Page 15: Lenguaje ensamblador basico

Registros del Micro-8086

En total maneja 14 registros distribuidos de la siguiente manera:

•OF (overflow, desbordamiento): Indica desbordamiento del bit de mayor orden después de una operación aritmética de números signados (1=existe overflow; 0=no existe overflow). Para operaciones sin signo, no se toma en cuenta esta bandera

•DF (dirección): Controla la selección de incremento o decremento de los registros SI o DI en las operaciones con cadenas de caracteres (1=decremento automático; 0=incremento). La bandera DF se controla con las instrucciones STD y CLD.

•IF (interrupción): Indica que una interrupción externa sea procesada o ignorada (1=habilita la interrupción; 0=deshabilita la interrupción). El estado de la bandera IF se controla con las instrucciones STI y CLI.

•TF (trampa): Permite la operación del procesador en modo de depuración (paso a paso)

•SF (signo): Contiene el signo resultante de una operación aritmética (0=positivo; 1=negativo).

•ZF (cero): Indica el resultado de una operación aritmética o de comparación (0=resultado diferente de cero; 1=resultado igual a cero).

•ZF (cero): Indica el resultado de una operación aritmética o de comparación (0=resultado diferente de cero; 1=resultado igual a cero).

•PF (paridad): Indica paridad par o impar en una operación de datos de ocho bits (0=paridad impar; 1=paridad par).

•CF (acarreo): Contiene el acarreo de los bits de mayor orden después de una operación aritmética; también almacena el contenido del último bit en una operación de corrimiento o de rotación.

Registro de Bandera

- - - - O D I T S Z - A - P - C

Page 16: Lenguaje ensamblador basico

Modos de Direccionamiento de Datos

Direccionamiento por Registro : Transfiere el contenido de un registro a otro del mismo tamaño.

MOV AX,BX Direccionamiento Inmediato : Transfiere el dato que sigue al código de operación al registro especificado.

MOV AX,3456H

Direccionamiento Directo: Se suma el desplazamiento dado al segmento de datos

MOV AX,1234H ; Acá 1234H es una dirección de memoria,

Direccionamiento indirecto por registro: Transfiere un dato entre un registro y una dirección

de memoria direccionada por un registro.

MOV AL,[SI]

Page 17: Lenguaje ensamblador basico

Calculo de direcciones de memoria

El 8086 tiene un bus de direcciones de 20bita. Por tanto un solo registro no tiene la capacidad de representar 20bits ya que los registros son de 16 bits. Cada dirección de memoria se divide en 2 partes. El segmento y el desplazamiento. La notación en Hex sería algo así SSSS:DDDD La manera de calcular una dirección real de memoria es correr el registro de segmento 4bits a la izquierda y luego sumarle el desplazamiento.

EJ: 2A54:0022

Al desplazar el segmento 4 bit a la izquierda, nos quedaría

2A540

Luego

2A540

+0022

______

2A562 Hex

De esta manera obtendremos la direccion absoluta de memoria.

Note que el resultado es de 20 bits

Page 18: Lenguaje ensamblador basico

Interrupciones

Es un mecanismo de transferencia de control, básicamente ocasiona que la CPU detenga su ejecución del programa actual y transfiera el control a una rutina de servicio.

Al terminar de ejecutar la interrupción, el CPU continua con los procesos que se estaban ejecutando antes de la interrupción.

Básicamente existen 2 tipos de interrupciones:

–De hardware

–De software

•Las interrupciones de hardware son asincronas, es decir, pueden ocurrir en cualquier momento y no están bajo el control del programa.

•Las interrupciones de Software, pueden invocarse a voluntad y son controladas por el programa en forma sincronica (es decir, se conoce todo lo relacionado con su ejecucion ya que el programa controla el momento y la manera en que son invocadas)

Page 19: Lenguaje ensamblador basico

Interrupciones

Int 21h

Verifica si existe una tecla a ser procesada

Ejemplo:

Funcion 09H

Envía una cadena de caracteres al dispositivo de salida estándar STDOUT.

AH = 09H

DS:DX = Apuntador a una cadena de caracteres terminada con el simbolo $

Page 20: Lenguaje ensamblador basico

Interrupciones

Int 16h

Lee un carácter del teclado

Ejemplo:

Funcion 00H

Envía una cadena de caracteres al dispositivo de salida estándar STDOUT.

llamada AH = 00H

Retorno AH= Código de escaneo del teclado

AL= Valor ASCII del carácter

Ejemplo de llamada

Mov AH,0

Int 16h

Page 21: Lenguaje ensamblador basico

Variantes permisibles de la instrucción mov

1. Mov registro, registro

2. Mov registro, memoria

3. Mov memoria, registro

4. Mov memoria, valor inmediato

5. Mov registro, valor inmediato

6. Mov memoria, acumulador

7. Mov acumulador, memoria

8. Mov Registro de segmento, memoria

9. Mov registro, registro de segmento

10. Mov registro de segmento, memoria

11. Mov memoria, registro de segmento

Page 22: Lenguaje ensamblador basico

Instrucción Xlat

Xlat es una instrucción que se utiliza para trabajar con tablas (o arreglos). Se utilizan los registros AL y BX.

La instrucción xlat reemplaza el valor de AL por un nuevo valor tomado de la tabla y el registro BX contiene la dirección del primer elemento de la tabla.

Ejemplo:

Tabla DB ‘ABCEDEFGHIJK’

….

Mov Bx, Offset Tabla

Mov AL, 3

Mov DL,AL ; Prepara dato para mostrar por pantalla

Mov AH,2 ; Función 2 de la int 21h. Donde DL debe tener carácter a desplegar.

Int 21h

; Se muestra por pantalla el tercer carácter de la tabla

Page 23: Lenguaje ensamblador basico

Instrucción Loop

Loop es una instrucción cuya función es realizar un bucle. trabaja en conjunto con el registro CX, donde “cx” contiene el numero de repeticiones que se debe realizar.

Mov CX,5

Mov Ax,1

Programa:

add ax,1

loop Programa

Page 24: Lenguaje ensamblador basico

Rutinas, saltos

Las rutinas son secuencias o bloques de código que pueden reutilizarse. Estas rutinas son invocadas por la instrucción CALL.

Existen dos tipos de instrucciones de salto o alteración del flujo de ejecución.

La instrucción jmp altera el flujo de ejecución enviando el control en forma incondicional a la dirección indicada.

Las instrucciones de salto condicional basan su bifurcación en el estatus que tengan ciertas banderas del registro correspondiente. Ejemplo.. Jnz (salta si el resultado es <> 0) y jz (salta si el resultado es cero)

Page 25: Lenguaje ensamblador basico

Ejemplo de Rutinas

. .model small

.data

.stack

.code

Inicio:

mov cx,5

call ciclo

mov ah,0

int 16h

ciclo:

add al,1

loop ciclo

ret

End inici

Page 26: Lenguaje ensamblador basico

Ejemplo de Saltos

.model small

.data

.stack

.code

Inicio:

mov cx,5

cmp cx,5 ;Compara Operando 1 y operando 2, si son iguales retorna 0

jz ciclo ;Si la bandera es Cero salta a la rutina indicada

ciclo:

add al,1

loop ciclo

mov ah,0

int 16h

End inicio