1. Republica Bolivariana de Venezuela
Ministerio del Poder Popular para la Educación
Universidad Fermín Toro
Facultad de Ingeniería
LENGUAJE ENSAMBLADOR
Autor:
Arianny
Lopez
2. El lenguaje ensamblador, o assembler, 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, micr
ocontroladores y otros circuitos
programables.
Implementa una representación simbólica
de los códigos de máquina binarios y otras
constantes necesarias para programar
una arquitectura de procesador y constituye
la representación más directa del código
máquina específico para cada arquitectura
legible por un programador.
PROGRAMA EMSAMBLADOR
Generalmente, un programa ensamblador moderno
crea código objeto traduciendo instrucciones mnemónicas de
lenguaje ensamblador en opcodes, y resolviendo los nombres
simbólicos para las localizaciones de memoria y otras
entidades. El uso de referencias simbólicas es una
característica clave del lenguaje ensamblador, evitando
tediosos cálculos y actualizaciones manuales de las
direcciones después de cada modificación del programa. La
mayoría de los ensambladores también incluyen facilidades
de macros para realizar sustitución textual. Los
ensambladores son generalmente más simples de escribir que
los compiladores para los lenguajes de alto nivel, y han
estado disponibles desde los años 1950. Los ensambladores
modernos, especialmente para las arquitecturas basadas
en RISC, tales como MIPS, Sun SPARC, y HP PA-RISC, así
como también para el x86 (-64), optimizan la planificación de
instrucciones para explotar la segmentación del CPU
eficientemente.
En los compiladores para lenguajes de alto nivel, son el
último paso antes de generar el código ejecutable.
3. El lenguaje ensamblador refleja directamente la
arquitectura y las instrucciones en lenguaje de
máquina de la CPU, y pueden ser muy diferentes de
una arquitectura de CPU a otra. Cada arquitectura de
microprocesador tiene su propio lenguaje de máquina,
y en consecuencia su propio lenguaje ensamblador ya
que este se encuentra muy ligado a la estructura del
hardware para el cual se programa. Los
microprocesadores difieren en el tipo y número de
operaciones que soportan; también pueden tener
diferente cantidad de registros, y distinta
representación de los tipos de datos en memoria.
Aunque la mayoría de los microprocesadores son
capaces de cumplir esencialmente las mismas
funciones, la forma en que lo hacen difiere y los
respectivos lenguajes ensamblador reflejan tal
diferencia.
4. REGISTROS
La UCP o CPU tiene 14 registros
internos, cada uno de ellos de 16
bits (una palabra). Los bits están
enumerados de derecha a izquierda,
de tal modo que el bit menos
significativo es el bit 0.
5. REGISTROS DE DATOS
AX: Registro acumulador. Es el principal empleado en las
operaciones aritméticas.
BX: Registro base. Se usa para indicar un desplazamiento.
CX: Registro contador. Se usa como contador en los bucles.
DX: Registro de datos. También se usa en las operaciones
aritméticas.
Estos registros son de uso general y también pueden ser utilizados
como registros de 8 bits, para utilizarlos como tales es necesario
referirse a ellos como por ejemplo: AH y AL, que son los bytes alto
(high) y bajo (low) del registro AX. Esta nomenclatura es aplicable
también a los registros BX, CX y DX.
6. REGISTRO DE SEGMENTOS
CS: Registro de segmento de código. Contiene la
dirección de las instrucciones del programa.
DS: Registro segmento de datos. Contiene la dirección
del área de memoria donde se encuentran los datos del
programa.
SS: Registro segmento de pila. Contiene la dirección del
segmento de pila. La pila es un espacio de memoria
temporal que se usa para almacenar valores de 16 bits
(palabras).
ES: Registro segmento extra. Contiene la dirección del
segmento extra. Se trata de un segmento de datos
adicional que se utiliza para superar la limitación de los
64Kb del segmento de datos y para hacer transferencias
de datos entre segmentos.
REGISTRO PUNTEROS DE PILA
SP: Puntero de la pila. Contiene la
dirección relativa al segmento de la pila.
BP: Puntero base. Se utiliza para fijar
el puntero de pila y así poder acceder a
los elementos de la pila.
REGISTRO INDICES
SI: Índice fuente.
DI: Índice destino.
7. PUNTERO DE INSTRUCCIONES
IP: Registro puntero de instrucción o
contador de programa (PC). Contiene el
desplazamiento de la siguiente instrucción
a ejecutar respecto al segmento de código
en ejecución. Por lo tanto, la dirección
completa de la siguiente instrucción sería
CS:IP. La única forma de influir en este
registro es de forma indirecta mediante
instrucciones de bifurcación.
REGISTRO DE BANDERAS
Banderas de estado: Registran el estado del procesador,
normalmente asociado a una comparación o a una
instrucción aritmética.
CF: Bandera de acareo
OF: Bandera de desbordamiento (aritmético).
ZF: Bandera de resultado 0 o comparación igual.
SF: Bandera de resultado o comparación negativa.
PF: Bandera de paridad (número par de bits).
AF: Bandera auxiliar. Indica si hay necesidad de ajuste en las
operaciones aritméticas con números BCD.
Banderas de control:
DF: Bandera de dirección. Controla la dirección de las
operaciones con cadenas de caracteres incrementando o
decrementando automáticamente los registros índices (SI y
DI)
IF: Bandera de interrupciones. Indica si están permitidas o
no las interrupciones de los dispositivos externos.
TF: Bandera de atrape. Controla la operación de modo paso
a paso
Cada bandera es un bit y se usa para
registrar la información de estado y de
control de las operaciones del
microprocesador. Hay nueve banderas (los
7 bits restantes no se utilizan):
8. En el lenguaje ensamblador las líneas de código constan de dos partes, la primera es el nombre de
la instrucción que se va a ejecutar y la segunda son los parámetros del comando u operando. Por
ejemplo:
ADD ah bh Aquí "ADD" es el comando a ejecutar (en este caso una adición o suma) y tanto "ah"
como "bh" son los parámetros. El nombre de las instrucciones en este lenguaje puede estar
formado de 2 a 6 letras, a estas instrucciones también se les llama nombres mnemónicos o
códigos de operación, ya que representan alguna función que habrá de realizar el procesador.
Existen algunos comandos que no requieren parámetros para su operación, así como otros que
requieren solo un parámetro. Algunas veces se utilizarán las instrucciones como sigue:
ADD al,[170] Los corchetes en el segundo parámetro nos indican que vamos a trabajar con el
contenido de la casilla de memoria número 170 y no con el valor 170, a esto se le conoce como
direccionamiento directo (en la instrucción viene la dirección del objeto).
9. TÉCNICAS DE CODIFICACIÓN EN ENSAMBLADOR
En ensamblador los bucle, condicionales, subrutinas y demás elementos se
codifica de forma distinta de cómo se hace en otros lenguajes de alto nivel.
BUCLES: Inicialización de un
registro(a modo de contador) al
nº de vueltas del bucle
Etiqueta: Primera instrucción
del bucle decrementar el
contador saltar a la etiqueta si
el contador es mayor que cero
SALTOS CONDICIONALES:
Instrucción de comparación
Evaluar condición y si se
cumple saltar a la etiqueta
prefijada saltar fuera del
condicional
MACROS:
Declaración:
<nombre de la macro>
MACRO
<instrucciones de la
macro> ENDM
Llamada:
<nombre de la macro>
SUBRUTINAS:
Declaración:
<nombre de la subrutina>PROC
<instrucciones de la macro>
RET
<nombre de la subrutina>
ENDP
Llamada:
CALL <nombre de la subrutina>
10. Una interrupción es una instrucción que detiene la ejecución de un programa para permitir el uso de la
UCP a un proceso prioritario. Una vez concluido este último proceso se devuelve el control a la aplicación
anterior. Por ejemplo, cuando estamos trabajando con un procesador de palabras y en ese momento llega
un aviso de uno de los puertos de comunicaciones, se detiene temporalmente la aplicación que
estábamos utilizando para permitir el uso del procesador al manejo de la información que está legando en
ese momento. Una vez terminada la transferencia de información se reanudan las funciones normales del
procesador de palabras. Las interrupciones ocurren muy seguido, sencillamente la interrupción que
actualiza la hora del día ocurre aproximadamente 18 veces por segundo. Para lograr administrar todas
estas interrupciones, la computadora cuenta con un espacio de memoria, llamado memoria baja, donde
se almacenan las direcciones de cierta localidad de memoria donde se encuentran un juego de
instrucciones que la UCP ejecutará para después regresar a la aplicación en proceso. La sentencia para
usar una interrupción en ensamblador es INT número. En el programa anterior hicimos uso de la
interrupción número 21h para llamar a DOS.
11. Instrucciones de Transferencia de Datos.
Su misión es intercambiar la información entre los registros y las posiciones de memoria. Las operaciones
de este tipo más relevantes son:
Las operaciones MOV no permitidas son
de memoria a memoria, inmediato a
registro de segmento y de registro de
segmento a registro de segmento. Para
estas operaciones es necesario utilizar
más de una instrucción.
No pueden utilizarse registros de segmento como operandos, ni tampoco dos direcciones de memoria.
12. La instrucción LEA AX, MEN1 es equivalente a MOV AX, OFFSET MEN1. Sin embargo no siempre
ocurre así, por ejemplo, LEA DX, [SI + datos] corresponde a MOV DX, OFFSET datos, mas la
instrucción ADD DX, SI
17. Instrucciones Lógicas y de Manejo de Bits
Se trata de instrucciones para realizar operaciones lógicas con los datos tales como AND, OR, XOR, etc.,
así como manipulación de los mismos a nivel de bits
Instrucciones Lógicas
19. Instrucciones de Transferencia de Control
Dentro de esta categoría de instrucciones, podemos distinguir entre instrucciones de transferencia de
control condicionales e incondicionales, bucles, llamadas a procedimientos y subrutinas de atención a
la interrupción. Las condicionales provocan una alteración en la secuencia normal de ejecución del
programa, haciendo que el flujo de ejecución ‘salte’ de un punto del programa a otro sin que ambos
sean consecutivos, dependiendo de que se cumpla o no una determinada condición relacionada
normalmente con el registro de estado. Las incondicionales tienen el mismo efecto pero sin depender
de los valores que en ese momento tengan las banderas del registro de estado. Los bucles permiten
ejecutar una determinada secuencia de operaciones varias veces. Por último, los procedimientos o
subrutinas aglutinan operaciones que se repiten reiteradamente a lo largo del programa, o bien,
contienen instrucciones que realizan una acción muy específica.
20. Instrucciones de Transferencia de Control Condicionales
Transfieren el control dependiendo de las configuraciones en el registro de banderas. Por ejemplo, se
pueden comparar dos datos y después saltar considerando los valores de las banderas que la comparación
ha establecido. Cada instrucción posee un único operando que no es más que el desplazamiento que indica
dónde ir si el test es positivo. Según consideremos los datos a comparar con o sin signo, distinguimos tres
tipos de saltos condicionales.
22. Bucles
Un bucle es un grupo de instrucciones que se ejecutan cíclicamente un número concreto de veces. Para
construir bucles disponemos de las siguientes instrucciones
23. Llamada a procedimientos
Dentro del segmento de código es posible tener cualquier número de procedimientos. Un procedimiento (o
subrutina) es una sección de código que realiza una tarea bien definida y clara (por ejemplo, situar el
cursor en una posición concreta de la pantalla). La utilización de procedimientos en los programas es
aconsejable porque:
• Reduce el número de líneas de código.
• Permite una mejor organización del programa.
• Facilita la localización de errores.
• Aumenta la legibilidad del programa.
La llamada a procedimientos se gestiona mediante dos instrucciones: CALL y RET
24. Instrucciones para Manejo de Cadenas
Una cadena es una secuencia de bytes contiguos. Las operaciones que se pueden realizar sobre las
cadenas son las siguientes:
25. Instrucciones de Control de Flags
Estas instrucciones permiten manipular los bits del registro de estado:
Instrucciones de entrada/salida
Los puertos de entrada y salida (E/S) permiten al procesador comunicarse con los periféricos. El 8086/88
utiliza buses de direcciones y datos ordinarios para acceder a los periféricos, pero habilitando una línea que
distinga el acceso a los mismos de un acceso convencional a la memoria (si no existieran los puertos de
entrada y salida, los periféricos deberían interceptar el acceso a la memoria y estar colocados en un área de la
misma). Para acceder a los puertos de entrada y salida se utilizan las instrucciones IN y OUT.