El término ensamblador 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, ejecutable directamente por el
microprocesador. El programa lee el fichero
escrito en lenguaje ensamblador y sustituye
cada uno de los códigos nemotécnicos que
aparecen por su código de operación
correspondiente en sistema binario para la
plataforma que se eligió como destino en las
opciones específicas del ensamblador.
Podemos distinguir entre dos tipos de ensambladores:
Ensambladores modulares 32-bits o de alto nivel .
Son ensambladores que aparecieron como
respuesta a una nueva arquitectura de
procesadores de 32 bits, muchos de ellos teniendo
compatibilidad hacia atrás pudiendo trabajar con
programas con estructuras de 16 bits. Además de
realizar la misma tarea que los anteriores,
permitiendo también el uso de macros, permiten
utilizar estructuras de programación más complejas
propias de los lenguajes de alto nivel.
Ensambladores básicos. Son de muy
bajo nivel, y su tarea consiste
básicamente en ofrecer nombres
simbólicos a las distintas
instrucciones, parámetros y cosas
tales como los modos.
Ciclos Numéricos
Un ciclo, conocido también como iteración,
es la repetición de un proceso un cierto
número de veces hasta que alguna
condición se cumpla. En estos ciclos se
utilizan los brincos "condicionales" basados
en el estado de las banderas. Por ejemplo la
instrucción jnz que salta solamente si el
resultado de una operación es diferente de
cero y la instrucción jz que salta si el
resultado de la operación es cero
Saltos
El salto sin condiciones, con el que podremos cambiarel control
a cualquier punto del programa. Sería como el "Goto" del Basic,
simplemente transferir el control a otro punto del programa. La
orden esJMP (de Jump, salto) Si se recuerdan los registros
CS:IP, se podrá ver qué es lo que hace realmente la instrucción,
y no es más que incrementar o decrementar IP para llegar a la
zona del programa a la que queremos transferir el control (IP es
el Offset que indica la zona de memoria que contiene la siguiente
instrucción a ejecutar, y CS el segmento). El formato más sencillo
para el salto sería JMP 03424h, lo que saltaría a esa zona. Pero
es algo complejo calcular en qué dirección va a estar esa
instrucción, con lo que utilizaremos etiquetas.
Los saltos podrían resumirse en un modo "Basic"
de la manera IF-THEN-GOTO de forma que cuando
se cumple una condición se salta a un sitio
determinado. He aquí los tipos de saltos
condicionales (las letras en mayúsculas son las
instrucciones): JO: Jump if overflow. Salta si el flag
de desbordamiento está a uno JNO: Jump if not
overflow. Salta si el flag de desbordamiento está a
cero. JC, JNAE, JB: Los tres sirven para lo mismo.
Significan: Jump if Carry, Jump if Not Above or
Equal y Jump if Below. Saltan por lo tanto si al
haber una comparación el flag de acarreo se pone a
1; es entonces equivalente a < en una operación sin
signo. JNC, JAE, JNB: Otros tres que valen
exactamente para lo mismo. Jump if not Carry, Jump
if Above or Equal y Jump if Not Below. Saltan por
tanto si al haber una comparación el flag de acarreo
vale 0, o sea, es equivalente al operador >=
Ciclos Condicionales
Las instrucciones de saltos
condicional hacen que el control de
flujo del programa salte a la
instruccion cuya direccion esta
especificada por su operando si
cumple una condicion dada. Jcond
direccion Cambia la direccion de la
siguiente instruccion a ser
ejecutada dependiendo del valor de
ciertas banderas.
Incremento y Decremento
Son las mas básicas a la hora de
hacer operaciones con registros
INC: incrementar el valor de un
registro o de cualquier posición en
memoria, en una unidad y DEC lo
decrementa. INC Ax Incrementa en
una el valor de Ax DEC Ax
Decrementa Ax, le resta uno.
Instrucciones Aritmeticas
Suma y Resta Los microprocesadores intel
80x86 disponen de las instrucciones add y
sub para realizar sumas y restas
respectivamente, estas instrucciones pueden
trabajar sobre operandos de longitud byte
(8bits), word(16bits), double-word(32bits) y
quad-word (64bits). Cada instruccion add
tiene la forma: add destino,fuente sub
destino,fuente
Multiplicacion y Division Estas operaciones multiplican
al acumulador por el operando indicado. Si el operando
es de 8 bits (1byte), el acumulador es Al si el operando
es de 16 bits, el acumulador de Ax. El resultado se
almacena en Ax o en el par Dx-Ax respectivamente, si
el operando es de 8 bits o de 16 bits. Para la division,
el dividiendo ha de estar en Ax, y ser 16 bits por tanto.
El divisor se indica en el operando, por ejemplo en Div
Bl, este divisor estaria en Bl, se dividira Ax entre Bl y el
resultado quedaria en Al, quedando el resto en Ah.
Manipulacion de la pila
La pila es un grupo de localidades de
memoria que reservan con la finalidad de
proporcionar un espacio para el
almacenamiento temporal de informacion. La
pila de los programas es del tipo LIFO (Last
In First Out, ultimo en entrar primero en
salir). Para controlar la pila el
microprocesador cuenta con dos
instrucciones basicas: Push "Meter", Pop
"Sacar". cuando se ejecuta la instruccion
Push, el contenido del operando se
almacena en la ultima posicion de la pila.
Captura y
Almacenamiento de
datos.
Permiten la opcion de meter o
introducir algun numero en un
programa deceado, en el cual
dando las instrucciones necesarias se
pueden ademas de ser capturadas
almacenarlas dentro del programa.
Ensamblador (y ligador) a utilizar
Un ligador, es un programa que enlaza
todos los programas o módulos
obteniendo lo que denominamos
programa ejecutable. Es un programa
que enlaza distintos módulos o
programas que poseen subprogramas.
Además incorporan las denominadas
rutinas de librerías en caso de
solicitarlas el propio programa.
Sus principales funciones son:
Enlazar código intermedio compilado
independientemente en un solo módulo de
carga resolviendo las diferencias entre
Tokens. Incorpora las denominadas rutinas de
librerías en caso de solicitarlas el propio
programa. Su función es reducir
procedimientos traducidos por separado y
enlazarlos para que se ejecuten como una
unidad llamada programa binario ejecutable.
Obtención de cadena con representación decimal
La representación del número decimal 1; 527 en los
tres formatos decimales: . ASCII 31 35 32 37 (cuatro
bytes) . BCD desempaquetado 01 05 02 07 (cuatro
bytes) . BCD empaquetado 15 27 (dos bytes) El
procesador realiza aritmética en valores ASCII y BCD
un dígito a la vez. Ya que los datos son ingresados
desde un teclado signican que están en formato
ASCII, la representación en memoria de un número
decimal ingresado tal como 1234 es 31323334H. Pero
realizar aritmetica sobre tal número implica un
tratamiento especial. Las instrucciones AAA y AAS
realizan aritmética de manera directa sobre números
ASCCI
Captura y almacenamiento de datos
numéricos
en el lenguaje ensamblador nos permite la opción de meter o
introducir algún numero en un programa deceado , en el cual
dando las instrucciones necesarias se pueden además de ser
capturadas almacenarlas dentro del programa. Para la
introducción de los datos ya sea numéricos o carácter es
necesario la interaccion a través de un dispositivo como : teclado,
raton, monitor,etc. Cuando un programa tiene mas variables que
registros, el compilador almacena las variables mas utilizadas en
los registros, y las restantes en memoria: derramar registros
(spilling) Solo las instrucciones de carga y almacenamiento
acceden a memoria , según los cálculos efectuados sobre
valores en los registros. alineación: una cantidad esta alineada si
su dirección de memoria es un múltiplo de su tamaño en bytes.
casi todas las instrucciones de carga y almacenamiento operan
solo sobre datos alineados. instrucciones para alinear datos o
alineados son : lwl , lwr, swl y swr.