El lenguaje ensamblador es un lenguaje de bajo nivel directamente traducible a lenguaje máquina. Permite control total de la computadora pero requiere traducción a lenguaje máquina antes de ser ejecutado. Un programa en ensamblador consiste de instrucciones, directivas y etiquetas para referirse a valores de memoria.
2. 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,
3. Que es?
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.
4. 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
5. 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
6. 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
7. 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
8. 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.
9. 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
10. 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
11. 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 AL (8 bits)
entrada/salida y la mayor parte de la aritmética.
AH (8 bits)
BX (16 bits): El registro BX es el registro base, y es el único registro de propósito general que BL (8 bits)
puede ser un índice para direccionamiento indexado. También es común emplear el BX para cálculos.
BH (8 bits)
CX (16 bits): El registro CX es conocido como el registro contador. Puede contener un valor para CL (8 bits)
controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits. CH (8 bits)
DX (16 bits): El registro DX es el registro de datos. Algunas operaciones de entrada/salida DL (8 bits)
requieren su pulso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y AX
DH (8 bits)
trabajando juntos.
12. 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 Índice
operaciones con cadenas de caracteres. El SI está asociado con el registro DS.
origen
DI: El registro índice destino también es requerido por algunas operaciones con Índice
cadenas de caracteres. El DI está asociado con el registro ES.
destino
BP: El apuntador base de 16 bits facilita la referencia de parámetros, los cuales Puntero a
son datos y direcciones transmitidos vía la pila.
base
SP: El apuntador de pila de 16 bits está asociado con el registro SS y proporciona Puntero de
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.
pila
13. 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 Segmento de código
registro CS.
DS: La dirección inicial de un segmento de datos de programa es almacenada en el registro Segmento de dato
DS.
ES: Algunas operaciones con cadenas de caracteres utilizan el registro extra de segmento Segmento Extra
para manejar el direccionamiento de memoria.
SS: El registro SS permite la colocación en memoria de una pila, para almacenamiento Segmento de pila
temporal de direcciones y datos.
14. Registros del Micro-8086 Continuación…
En total maneja 14 registros distribuidos de la siguiente manera:
Registro apuntador de instrucciones
IP Apuntador de instrucciones
IP: El registro IP de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta
15. Registros del Micro-8086
En total maneja 14 registros distribuidos de la siguiente manera:
Registro de Bandera
- - - - O D I T S Z - A - P - C
•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.
16. 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]
17. 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
18. 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)
19. 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
$
20. 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
21. 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
22. 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
23. 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
24. 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)
25. 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
26. 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