El lenguaje ensamblador como cualquier lenguaje de programación es un conjunto de palabras
que le indican al ordenador lo que tiene que hacer. Sin embargo la diferencia fundamental es que
cada instrucción escrita en lenguaje ensamblador tiene una correspondencia exacta con una
operación en el procesador. Por lo que son operaciones muy sencillas tales como: “Cargar 32 en
el registro BX” o “Transferir el contenido del registro CL al CH”. Así pues, las palabras del lenguaje
ensamblador son nemotécnicos que representan el código máquina, lenguaje que entiende el
procesador.
Almacenamiento de datos
El 8086/88 usa el formato de almacenamiento denominado “little endian”, esto quiere decir que el
byte menos significativa (LSB) del dato es guardada en la parte baja de la memoria. Por ejemplo
el dato 0x1122 será almacenado en memoria:
Registros de datos
Los registros de datos son de 16 bits, aunque están divididos. lo que permite su acceso en 8 bits.
Estos registros son de propósito general aunque todos tiene alguna función por defecto.
AX (acumulador) se usa para almacenar el resultado de las operaciones, es al único registro con
el que se puede hacer divisiones y multiplicaciones. Puede ser accedido en 8 bits como AH para
la parte alta (HIGH) y AL (LOW) para la parte baja.
BX (registro base) almacena la dirección base para los accesos a memoria. También puede
accederse como BH y BL, parte alta y baja respectivamente.
CX (contador) actúa como contador en los bucles de repetición. CL (parte baja del registro)
almacena el desplazamiento en las operaciones de desplazamiento y rotación de múltiples bits.
DX (datos) es usado para almacenar los datos de las operaciones.
Registros de segmento
Los registros de segmento son de 16 bits (como ya se dicho antes) y contienen el valor de
segmento.
CS (segmento de código) contiene el valor de segmento donde se encuentra el código. Actúa en
conjunción con el registro IP para obtener la dirección de memoria
que contiene la próxima instrucción. Este registro es modificado por las instrucciones de saltos
lejanos.
DS (segmento de datos) contiene el segmento donde están los datos.
ES (segmento extra de datos) es usado para acceder a otro segmento que contiene más datos.
SS (segmento de pila) contiene el valor del segmento donde está la pila. Se usa conjuntamente
con el registro SP para obtener la dirección donde se encuentra el último valor almacenado en la
pila por el procesador.
Registros de índice
Estos registros son usados como índices por algunas instrucciones. También pueden ser usados
como operandos (excepto el registro IP).
IP (índice de programa) almacena el desplazamiento dentro del segmento de código. Este registro
junto al registro CS apunta a la dirección de la próxima instrucción. No puede ser usado como
operando en operaciones aritmético/lógicas.
SI (índice de origen) almacena el desplazamiento del operando de origen en memoria en algunos
tipos de operaciones (operaciones con operandos en memoria).
DI (índice de destino) almacena el desplazamiento del operando de destino en memoria en
algunos tipos de operaciones (operaciones con operandos en memoria).
SP (índice de pila) almacena el desplazamiento dentro del segmento de pila, y apunta al último
elemento introducido en la pila. Se usa conjuntamente con el registro SS.
BP (índice de base) se usa para almacenar desplazamiento en los distintos segmentos. Por
defecto es el segmento de la pila.
Registro de estados
El registro de estado contiene una serie de banderas que indican distintas situaciones en las que
se encuentra el procesador.
OF (desbordamiento) es el principal indicador de error producido durante las operaciones con
signo. Vale 1 cuando:
* La suma de dos números con igual signo o la resta de dos números con signo opuesto
producen un resultado que no se puede guardar (más de 16 bits).
* El bit más significativo (el signo) del operando ha cambiado durante una operación de
desplazamiento aritmético.
* El resultado de una de una operación de división produce un cociente que no cabe en el registro
de resultado
DF (dirección en operaciones con cadenas) si es 1 el sentido de recorrido de la cadena es de
izquierda a derecha, si es 0 irá en sentido contrario.
IF (indicador de interrupción) cuando vale 1 permite al procesador reconocer interrupciones. Si se
pone a 0 el procesador ignorará las solicitudes de interrupción.
TF (modo traza) indica al procesador que la ejecución es paso a paso. Se usa en la fase de
depuración.
SF (indicador de signo) solo tiene sentido en las operaciones con signo. Vale 1 cuando en una de
estas operaciones el signo del resultado es negativo.
ZF (indicador de cero) vale 1 cuando el resultado de una operación es cero.
AF (acarreo auxiliar) vale 1 cuando se produce acarreo o acarreo negativo en el bit 3.
PF (paridad) vale 1 si el resultado de la operación tiene como resultado un número con un número
par de bits a 1. Se usa principalmente en transmisión de datos.
CF (bit de acarreo) vale 1 si se produce acarreo en una operación de suma, o acarreo negativo en
una operación de resta. Contiene el bit que ha sido desplazado o rotado fuera de un registro o
posición de memoria. Refleja el resultado de una comparación.
Instrucciones de tranferencias de datos
Las instrucciones de transferencia de datos copian datos de un sitio a otro y son: MOV, XCHG,
XLAT, LEA, LDS, LES, LAHF, SAHF, PUSH, PUSHF, POP, POPF.
MOV realiza la transferencia de datos del operando de origen al destino. MOV admite todos los tipos de direccionamiento.
Ambos operandos deben ser del mismo tamaño y no pueden estar ambos en memoria.
XCHG realiza el intercambio entre los valores de los operandos. Puede tener operando en
registros y en memoria:
XLAT carga en AL el contenido de la dirección apuntada por [BX+AL].
Ejemplo:
LEA carga en un registro especificado la dirección efectiva especificada como en el operando
origen:
LEA reg, mem
Ejemplos:
para este tipo de acceso (el del segundo ejemplo) la instrucción LEA es mas eficiente, que con la
instrucción MOV e instrucciones de multiplicación.
PUSH y POP realizan las operaciones de apilado y desapilado en la pila del procesador
respectivamente, admiten todos los tipos de direccionamiento (excepto inmediato). Los operandos
deben ser siempre de 16 bits.
PUSH reg
PUSH mem
PUSH seg-reg
POP reg
POP mem
POP seg-reg
PUSHF y POPF apila y desapila el registro de estado, respectivamente.
LAHF carga la parte baja del registro de estado en AH.
SAHF carga AH en el la parte baja del registro de estado.
Saltos condicionales
Estas instrucciones realizan el salto a la dirección especificada en función
de si se cumple o no una condición. Para evaluar la condición se considera el registro de estado,
esto quiere decir que la condición depende directamente de la instrucción anterior.
Bucles
Las instrucciones de bucle se usan para realizar estructuras repetitivas, y utilizan el registro CX
como contador.
LOOP esta instrucción hace que el programa salte a la dirección especificada (salto dentro del
segmento), mientras que CX sea distinto de 0 y decrementa CX en 1 cada vez.
LOOP salto
Directivas
Las directivas más comunes son:
Las directivas simplificadas se utilizan para la definición de segmentos.
.MODEL para usar las directivas simplificadas es necesario incluir esta directiva que define el
modelo de memoria que debe usarse. Algunos de los argumentos que puede tomar son:
TINY: para programa con un solo segmento para datos y código (tipo .COM)
SMALL: para programas con un solo segmento de datos (64K, incluida la pila) y otro de
código (64K).
LARGE: varios segmentos de datos y código (1Mb para cada uno).
MEDIUM: Varios segmentos de código y 1 de datos.
COMPACT: 1 segmento de código y varios de datos.
.STACK n sirve para fijar un tamaño n del segmento de pila, por defecto 1K.
.DATA abre el segmento de datos.
.CODE abre el segmento de código, al final código debe aparecer END.
Una vez inicializado los segmento se permite usar los símbolos @CODE y @DATA en lugar del nombre de los segmentos de código y datos respectivamente.
Justo después de la directiva .CODE hay que inicializar el segmento de datos (ya que la directiva
no genera código):
MOV AX, @DATA
MOV DS, AX
No hay comentarios:
Publicar un comentario