Post on 14-Jun-2015
Lenguaje ensamblador
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,
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?
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
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
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
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
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.
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
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
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)
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
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
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
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
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]
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
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)
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 $
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
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
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
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
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)
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
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