Professional Documents
Culture Documents
Las características generales del 286 son: tiene un bus de datos de 16 bits, un
bus de direcciones de 24 bits (16 Mb); posee 25 instrucciones más que el 8086 y
admite 8 modos de direccionamiento. En modo virtual permite direccionar hasta
1 Gigabyte. Las frecuencias de trabajo típicas son de 12 y 16 MHz, aunque
existen versiones a 20 y 25 MHz. Aquí, la instrucción más lenta es la misma que
en el caso del 8086, solo que emplea 29 ciclos de reloj en lugar de 206. Un 286
de categoría media (16 MHz) podría ejecutar más de medio millón de
instrucciones de estas en un segundo, casi 15 veces más que un 8086 medio a 8
MHz. Sin embargo, transfiriendo datos entre registros la diferencia de un
procesador a otro se reduce notablemente, aunque el 286 es más rápido y no sólo
gracias a los MHz adicionales.
!#&%"!-%.#(/.#(
AX SP CS IP
BX BP DS flags
CX SI SS
DX DI ES
Registros Registros Registros Registro puntero
de datos punteros de de de instrucciones
pila e segmento y flags
índices
AX, BX, CX, DX: pueden utilizarse bien como registros de 16 bits o como
dos registros separados de 8 bits (byte superior e inferior) cambiando la X por H
o L según queramos referirnos a la parte alta o baja respectivamente. Por
ejemplo, AX se descompone en AH (parte alta) y AL (parte baja).
Evidentemente, ¡cualquier cambio sobre AH o AL altera AX!: valga como
ejemplo que al incrementar AH se le están añadiendo 256 unidades a AX.
AX = Acumulador.
BX = Base.
Se usa como registro base para referenciar direcciones de memoria con
direccionamiento indirecto, manteniendo la dirección de la base o comienzo de
tablas o matrices. De esta manera, no es preciso indicar una posición de memoria
fija, sino la a (así, haciendo avanzar de unidad en unidad a BX, por
ejemplo, se puede ir accediendo a un gran bloque de memoria en un bucle).
CX = Contador.
Se utiliza comúnmente como contador en bucles y operaciones repetitivas
de manejo de cadenas. En las instrucciones de desplazamiento y rotación se
utiliza como contador de 8 bits.
DX = Datos.
Usado en conjunción con AX en las operaciones de multiplicación y
división que involucran o generan datos de 32 bits. En las de entrada y salida se
emplea para especificar la dirección del puerto E/S.
!*
*
Definen áreas de 64 Kb dentro del espacio de direcciones de 1 Mb del
8086. Estas áreas pueden solaparse total o parcialmente. No es posible acceder a
una posición de memoria no definida por algún segmento: si es preciso, habrá de
moverse alguno.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Los 386 y superiores disponen de muchos más registros de los que vamos a
ver ahora. Sin embargo, bajo el sistema operativo DOS sólo se suelen emplear
los que veremos, que constituyen básicamente una extensión a 32 bits de los
registros originales del 8086.
-.-%.#.!#cc-'
#'"-
Son los distintos modos de acceder a los datos en memoria por parte del
procesador. Antes de ver los modos de direccionamiento, echaremos un vistazo a
la sintaxis general de las instrucciones, ya que pondremos alguna en los
ejemplos:
??????????????? ?????
? ?
?
CS SS DS ES
IP Sí No No No
SP No Sí No No
BP con prefijo por defecto con prefijo con prefijo
BX con prefijo con prefijo por defecto con prefijo
SI con prefijo con prefijo por defecto con prefijo
DI con prefijo con prefijo por defecto con prefijo(1)
(1) También por defecto en el manejo de cadenas.
4( (
Como se puede ver, la segunda instrucción (bytes de código máquina 0B8h, 0 y 0B8h
colocados en posiciones consecutivas) está colocada a partir del desplazamiento 7A13h, ya
que la anterior que ocupaba 3 bytes comenzaba en 7A10h. En el ejemplo cargamos el valor
0B800h en DS apoyándonos en AX como intermediario. El motivo es que los registros de
segmento no admiten el direccionamiento inmediato. A medida que se van haciendo
programas, el ensamblador da mensajes de error cuando se encuentra con estos fallos y
permite ir aprendiendo con facilidad las normas, que tampoco son demasiadas. La
instrucción !" equivale a decir: #aa
a
aa
(DS:[BX] para ser más exactos)a
$%aa
!"&. El valor 0F8h del
código máquina de la última instrucción es el complemento a dos (número negativo) del
valor 8.
Normalmente, casi nunca habrá que ensamblar consultando unas tablas, como
hemos hecho en este ejemplo. Sin embargo, la mejor manera de aprender ensamblador es
no olvidando la estrecha relación de cada línea de programa con la CPU y la memoria.