Esta primera leccion va a ser sobre todo teorica.
No se puede programar en ensamblador sin tener un conocimiento mas o
menos profundo acerca de
las peculiaridades de la maquina que vamos a
programar. Esto es obvio, ya que en ensamblador tenemos un control total del sistema, por tanto, cuanto mas sepamos acerca de ‚l, mas provecho podremos sacar del
mismo, y mejores resultados obtendremos.En primer lugar debemos saber con que‚ estamos trabajando, y no me refiero al lenguaje en si, sino a la computadora en cuestion. Tendremos que conocer de que partes
consta, como se comunican entre si, etc.
Esta parte teorica es casi imprescindible para poder entender ciertas tecnicas de programacion.
Vamos a estudiar la Pc en general, no distinguiremos entre distintas
familias de procesadores (8086,286,386,etc) ya que vamos a utilizar ensamblador del 8086. En realidad es el ensamblador que yo utilizo. Por tanto, aunque estemos programando sobre un 80586 o un 80486,
desarrollaremos codigo ejecutable para la familia 80x86 en general.
Cualquier exposicion que haga ser valida para toda la familia Pc.
Una Pc esta compuesta principalmente por procesador, chips de memoria,
varios chips inteligentes o programables, y el bus de datos y direcciones.
Junto con todo esto, nos encontramos los perifericos como son monitor,
disqueteras, teclado, etc, que se comunican con el procesador.
Esto (la comunicacion del procesador con perifiricos) se vera mas adelante.
El procesador:
Es el chip que ejecuta los programas. El procesador o CPU,
lleva a cabo una gran variedad de calculos,
comparaciones numericas y
transferencias de datos como respuesta a las peticiones de los programas que estan siendo ejecutados en memoria.
La CPU controla las operaciones basicas de la pc enviando y
recibiendo señales de control, direcciones de memoria y datos de un lugar a otro de la maquina a traves de un grupo de 'sendas electronicas' llamadas BUS.
Localizadas a lo largo de este bus estan las puertas de
entrada y salida
(E/S en castellano o I/O en ingles), las cuales conectan a la memoria y a
los chips de apoyo al bus. Los datos pasan a traves de estas puertas de E/S
mientras viajan desde y hasta la CPU y otras partes del ordenador.
Como les dec¡a antes, trataremos el procesador 8086, siendo valido todo lo
que digamos para el resto de procesadores de la familia PC.
El procesador 8086 es un procesador de 16 bits.
Esto quiere decir entre otras cosas, que el procesador va a manipular
en una sola operacion datos de hasta 16 bits. Es decir, cuando transfiera
datos a la
memoria o los traiga desde ella, lo podra hacer de 16 bits en
16 bits. Aqu¡ juega un papel decisivo el BUS de datos, ya que es por el por
donde circulan los datos en las transferencias. Mas detalles unas
cuantas
lineas mas abajo.
El procesador cuenta con una serie de registros usados para realizar
las operaciones de calculo, y como almacenamiento de datos.
Para que te hagas una idea, un registro del
procesador es algo as¡ como
una zona de memoria dentro del procesador donde se puede almacenar
informacion, de forma que el acceso a esta informacion es instantaneo,
ya que no hay que utilizar el bus de datos
que conecta el procesador con
la memoria para obtener dichos datos.
Estos registros se dividen en 5 grupos, segun sus funciones:
1. Registros de datos: AX, BX, CX y DX.
Se usan para calculo y
almacenamiento de proposito general. Son utilizados
por los programas para realizar calculos, as¡ como para transferir datos
de una posicion de memoria a otra, ya que no se puede hacer de forma
directa.
Es decir, que no podemos transferir un dato de la posicion de memoria
X a la posicion Y sin antes depositar ese dato temporalmente en un
registro del procesador.
Estos registros tienen una longitud de 16 bits, pero podemos
descomponerlos cuando nos interese en un par de registros de 8 bits.
Quedando de la forma siguiente:
AX = AH + AL
Siendo AX el registro de 16 bits,
compuesto por la conjuncion (que no la
suma) de el registro AH de 8 bits (los 8 bits m s signiicativos o de mas
a la izquierda) y el registro AL de 8 bits (los 8 bits menos
significativos o de mas a la derecha).
BX = BH + BL
CX = CH + CL
DX = DH + DL
Para estos tres registros se aplica lo mismo que para el registro AX.
Cada uno de estos registros tiene funciones especiales que es interesante
conocer. Por
ejemplo el registro AX es el llamado acumulador, hace que
muchas operaciones tengan una forma mas corta, ya que lo especifican
impl¡citamente. Es decir, que hay operaciones que actuan sobre el
registro AX en particular.
BX se suele utilizar en muchas instrucciones como registro base, sobre
todo en transeferencias de datos entre memoria y procesador.
CX es el registro contador, muchas instrucciones lo
utilizan para hacer
incrementos o decrementos automaticos, para realizar bucles, etc.
DX es el registro de datos, se suele utilizar para operaciones de 32 bits,
para almacenar los 16 bits (o palabra) mas significativos.
2. Registros Indice: SI, DI, BP y SP.
Se utilizan para acceder a memoria cuando se establece el modo de
direccionamiento mediante indexacion o con punteros.
SI y DI indican el ¡ndice fuente y destino respectivamente.
BP y SP indican el puntero base y el puntero de la pila respectivamenete.
Mas adelante hablaremos
de la pila (que es un tipo de datos estructurado).
Estos 4 registros son de 16 bits, y no pueden ser utilizados como
registros dobles de 8 bits.
3. Registros de Segmento: CS, DS, SS y ES.
Estos registros
apuntan al principio de un bloque de 64 ks de memoria o
segmento, de ah¡ lo de la 'S' con la que finalizan todos los registros:
CS: registro segmento de codigo. Establece al area donde se halla el
programa en ejecucion.
DS: registro segmento de datos. Especifica la zona donde el programa
lee y escribe los datos por defecto.
SS: registro segmento de pila. Especifica el area donde se encuentra la
pila del sistema.
ES: registro segmento extra. Se utiliza como una extension del segmento
de datos. Es decir, indica otra area de datos aparte del especificado
por DS.
4. Puntero de instruccion: IP.
Su longitud es de 16 bits como el resto de registros.
Indica la direccion de la siguiente instruccion a ejecutar, y su valor es
ajustado durante la ejecucion de la instruccion en curso.
Esta direccion est en el area de 64 ks de direcciones especificado
por CS.
CS e IP en conjuncion conforman la direccion f¡sica real de la siguiente
instruccion a ejecutar.
Mas adelante detallaremos este asunto.
5.Registro FLAGS. O banderas de estado.
Su longitud es de 16 bits. Cada uno de estos bits contiene cierta
informacion booleano (verdadero o falso). Segun el valor de
cada uno de
estos bits sea 1(verdadero) o 0(falso), informar del estado de alguna
situacion en particular.
Dentro del registro de FLAGS hay 7 bits que no se utilizan. Los nombres
de los utilizados son: Of, Df, If, Tf, Sf, Zf, Af, Pf y Cf.
Estos bits se clasifican en dos grupos:
Flags de estado (Cf, Af, Of, Zf, Pf y Sf): muestran el estado del
procesador.
Flags de control ( Df,
If, Tf): determinan como el procesador responder
a determinadas situaciones. El programador manipular estos bits para
controlar el modo de ejecucion de algunas instrucciones.
A continuacion se muestra el significado de cada uno de los flags:
Cf: Bit de Carry (acarreo), se activa (se pone a 1) si se produce acarreo
en una operacion aritmetica.
Pf: Bit de paridad, se activa si el resultado de una operacion tiene
paridad par, es decir, si el resultado tiene un par de unos.
Af: Bit de carry auxiliar, se activa si una operacion aritmetica produce
acarreo de peso 16.
Zf: Bit de cero, se activa si una operacion produce 0 como resultado.
Suele ser el mas utilizado(mas consultado) por los programadores,
por lo menos por mi . Se utiliza para comparaciones de datos
y para otras muchas cosas como ciertos bucles,etc.
Sf: Bit de signo, se activa si el bit m s significativo de un resultado
es 1. Por convencion cuando se opera con numeros negativos, se
utiliza el bit de mayor peso para indicar el signo: si el bit es cero,
entonces se trata de un numero positivo, si es 1, se trata de numero
negativo.
Tf: Bit trap o desv¡o. Si Tf=1, el procesador ejecuta las instrucciones
una a una bajo control del usuario. Se pone a 1 este bit para realizar
depuraciones del codigo que se est ejecutando. De
esta forma se puede
seguir el flujo del programa.
If: Bit de interrupcion, si vale 1, las interrupciones estan permitidas,
y si vale 0, no.
Df: Se usa en las instrucciones que manipulan cadenas de bytes.
Segun coloque el programador este bit, a '0' o a '1', las cadenas
de bytes seran tratadas en sentido de direcciones crecientes o
decrecientes.
Of: Bit de overflow, indica desbordamiento en una operacion aritmetica.