Вы находитесь на странице: 1из 18

Los procesadores 80X86 en el modo real

Modo básico de funcionamiento del 8086.

Emulado por todos los procesadores de la


familia XX86.

Mantenido por compatibilidad.

No pueden utilizarse todos los recursos de


la CPU.

Máxima cantidad de memoria direccionable:


1 Mbyte -> 20 bits.

Modo utilizado por MS-DOS cuando no se


instalan controladores de memoria.
Los procesadores 80X86 en el modo real

15 87 0
AH AX AL Acumulador
BH BX BL Base
CH CX CL Contador
DH DX DL Datos

SP Puntero de pila
BP Puntero base
SI Registro de índice fuente
DI Registro de índice destino

CS Segmento de código
DS Segmento de datos
ES Segmento extra
SS Segmento de pila

IP Puntero de instrucciones
FLAGS Registro de estado
Los procesadores 80X86 en el modo real

Registro de estado (flags)

15 0
OF DF IF TF SF ZF AF PF CF

CF Acarreo
OF Desbordamiento
ZF Cero FLAGS DE
SF Signo ESTADO
PF Paridad
AF Ajuste decimal
DF Dirección de recorrido de cadenas
FLAGS DE
IF Máscara de interrupción
CONTROL
TF Ejecución paso a paso
Los procesadores 80X86 en el modo real

SEGMENTOS:

Registros internos de 16 bits. No pueden


direccionar toda la memoria (1 Mbyte)

Un segmento es un bloque de memoria de


64 Kbytes, definido por su base.
s
te
by
K
64

Base del
segmento
Memoria
Los procesadores 80X86 en el modo real

Una dirección de memoria absoluta se expresa como


un desplazamiento (offset) dentro de un segmento

Desplazamiento Dirección
(offset) física

Registro de
segmento Memoria

En general las direcciones de memoria se presentan como:

BASE : OFFSET
Los procesadores 80X86 en el modo real

Obtención de la dirección efectiva:

OFFSET (16 bits)

+ Desplazado
4 bits
BASE SEGMENTO (16 bits)

=
DIRECCIÓN EFECTIVA (20 bits)

Existen muchas formas de expresar una dirección:

Ejemplo:

dirección efectiva absoluta : F3B5A

BASE OFFSET

F3B5 : 000A
F3B0 : 005A
F300 : 0B5A
F200 : 1B5A

En general existen 4096 formas diferentes de expresar


una dirección
Los procesadores 80X86 en el modo real

Registros de segmento:

Existen 4 registros de segmento: CS, DS, ES y SS


CS Contiene el código del programa
DS Destinado a contener datos
ES Destinado también a contener datos
SS Contiene la pila del programa

Los segmentos pueden colocarse de cualquier modo en


la memoria:
Contiguos Separados Superpuestos

CS
DS
ES
SS
Los procesadores 80X86 en el modo real

Generación de las direcciones:

BASE OFFSET

CICLOS REGISTRO REGISTRO


DE “FETCH” CS IP

ACCESOS REGISTRO REGISTRO


A LA PILA SS SP
CUALQUIER
ACCESOS SEGÚN MODO DE
REGISTRO
A DATOS DIRECCIONAMIENTO
DS, CS, ES o SS

Para pequeñas aplicaciones que necesiten poca memoria


se puede utilizar un solo segmento haciendo:

CS = DS = ES = SS

Este es el caso de los ficheros *.COM de MS-DOS


Los procesadores 80X86 en el modo real

MODOS DE DIRECCIONAMIENTO

MODO FORMATO DEL SEGMENTO POR


OPERANDO DEFECTO

A REGISTRO reg NINGUNO

INMEDIATO valor (dato) NINGUNO

DIRECTO variable (desp) DS

INDIRECTO POR [BX] DS


REGISTRO [BP] SS
[DI] DS
[SI] DS

RELATIVO A BASE [BX + desp] DS


[BP + desp] SS

INDEXADO [DI + desp] DS


[SI + desp] DS

INDEXADO A BASE [BX + SI + desp] DS


[BP + SI + desp] SS
[BX + DI + desp] DS
[BP + DI + desp] SS
Los procesadores 80X86 en el modo real

Para utilizar otro registro de segmento que no sea el


establecido por defecto se utiliza el llamado:

PREFIJO DE SEGMENTO

REGISTRO SEGMENTO

BP, BX, SI, DI CUALQUIERA


IP SIEMPRE CS
SP SIEMPRE SS
AX,CX,DX NINGUNO

Se escribe el registro deseado seguido de “:”

Ejemplo:

MOV AX, [SI+desp] relativo a DS

MOV AX, ES:[SI+desp] relativo a ES


LOS PROCESADORES XX86 EN EL MODO REAL

El juego de instrucciones en el modo real

Instrucciones de movimiento de datos


MOV dst, fnt Destino : Registro o posición de memoria
Fuente : Registro, posición de memoria o dato inmediato

PROHIBIDO:
Dato inmediato a reg. de segmento,
Destino=CS
Destino y fuente ambos en memoria

POP destino Sacar de la pila


PUSH fuente Meter en la pila
POPF Sacar el contenido de la pila al registro F
PUSHF Meter el registro F en la pila

OUT port, reg Sacar un dato por el puerto port


IN reg, port Leer un dato del puerto port
(para puertos mayores de 255 DX = port)
(reg siempre es AL o AX)

LAHF Byte bajo de F a AH


SAHF Inversa

XCHG dst, fnt Igual que MOV pero intercambia contenidos

LDS reg, mem Lee una doble palabra de memoria, los primeros 16 bits
LES reg, mem van al registro y los siguientes a ES o DS

LEA reg,dir Carga una dirección efectiva en un registro


LOS PROCESADORES XX86 EN EL MODO REAL

Instrucciones aritméticas

ADD dst, fnt Suma fuente y destino


ADC dst, fnt Suma fuente, destino y acarreo (C)

SUB dst, fnt Resta destino - fuente


SBC dst, fnt Suma destino - fuente - acarreo (C)

IMUL fnt Multiplicación con signo


MUL fnt Multiplicación sin signo
(Multiplica fuente por AX o AL)
(Destino es DX:AX o AX)

DIV fnt División sin signo


IDIV fnt División con signo
(Dividendo es DX:AX o AX)
(Cociente;resto es AX;DX o AL;AH)

INC dst Incremento del destino


DEC dst Decremento del destino

NEG dst Complemento a 2 del destino

DAA Ajuste decimal para la suma en BCD


DAS Ajuste para la resta en BCD

AAA Ajuste para la suma en ASCII


AAS Ajuste para la resta en ASCII
AAM Ajuste para la multiplicación en ASCII
AAD Ajuste para la división en ASCII
AJUSTE DECIMAL EN BCD

Se realiza detrás de la suma y de la resta

4 5 0100 0101
+ ADD +
1 6 0001 0110

5 B 0101 1011
Sin sentido en BCD
flag AF

4 9 0100 1001
+ ADD +
1 8 0001 1000

6 1 0110 0001
Resultado erróneo en BCD
AJUSTE DECIMAL EN BCD

DAA comprueba:

‹ Que la cifra de unidades es <= 9


‹ Que no ha habido acarreo parcial (AF=0)

Si no se cumple alguna de estas dos:

‹ Debemos restar 10 a las unidades


‹ Y además sumar 1 a las decenas

Dec. Unid.
Es equivalente
- 0000 1010
a sumar 6
+ 0001 0000

+ 0000 0110

4 9 4 5
+ ADD + ADD
1 8 1 6

6 1 DAA 5 B DAA

6 7 6 1
LOS PROCESADORES XX86 EN EL MODO REAL

Instrucciones lógicas

AND dst, fnt Operaciones lógicas bit a bit


OR dst, fnt
XOR dst, fnt
NOT dst

TEST dst, fnt Realiza función AND sin guardar resultado

SAL dst, cnt C 0

SAR dst, cnt C

SHR dst, cnt 0 C

ROL dst, cnt C

ROR dst, cnt C

RCL dst, cnt C

RCR dst, cnt C

Generalmente cnt es CX
LOS PROCESADORES XX86 EN EL MODO REAL

Instrucciones de transferencia de control


JMP d Salto incondicional
d puede ser:
Una etiqueta
Una dirección absoluta de memoria
Salto corto -> sólo desplazamiento
Salto largo -> segmento : desplazamiento
Una referencia indirecta
JMP [33FE], debe indicarse FAR o NEAR

CALL d Llamada a subrutina


Iguales condiciones que JMP
Almacena en la pila la dirección de retorno
IP en saltos cortos, IP y CS en saltos largos

RET Retorno de subrutina

Bucles

Si CX = 0 se ejecuta instrucción siguiente


LOOP d
Si CX ≠ 0 se salta a la etiqueta d y se decrementa CX

Comparación

dst - fnt
CMP dst,fnt
Modifica los flags en función del resultado
LOS PROCESADORES XX86 EN EL MODO REAL

JNS SF=0 If no sign/positive


JN SF=1 If sign/negative

JNO OF=0 If no overflow Saltos


JO OF=1 If overflow
Condicionales
JNC CF=0 If no carry
JAE If above or equal Después de CMP d,f
JNB If not below
JC CF=1 If carry Si SIN sgn CON sgn
JNAE If not above/equal
JB If below d<f JB JL
d=f JE JE
JNE ZF=0 If not equal d>f JA JG
JNZ If not zero d≥f JAE JGE
JE ZF=1 If equal d≤f JBE JLE
JZ If zero d≠f JNAE JNE

JNP PF=0 If no parity


JPO If parity odd
JP PF=1 If parity
JPE If parity even

JA CF=0 Y ZF=0 If above


JNBE If not below/equal
JNA CF=1 O ZF=1 If not above
JBE If below or equal

JGE SF=OF If greater or equal


JNL If not less
JNGE SF≠OF If not greater/equal
JL If less

JG SF=OF Y ZF=1 If greater


JNLE If not less/equal
JLE SF≠OF O ZF=1 If less or equal
JNG If not greater

JCXZ CF=0 Y CX=0 If CX is 0


LOS PROCESADORES XX86 EN EL MODO REAL

Instrucciones de manejo de cadenas


MOVSB Mover un byte
MOVSW Mover un word
FUENTE apuntada por DS:SI
DESTINO apuntado por ES:DI
Incrementa o decrementa SI y DI en función de flag DF

REP MOVSB Repite la instrucción anterior tantas veces como


REP MOVSW indique CX

Otras
CLC Poner a 0 el flag CF
CLD Poner a 0 el flag DF
CLI Poner a 0 el flag IF (Prohibir todas las interrupciones)
STC Poner a 1 el flag CF
STD Poner a 1 el flag DF
STI Poner a 1 el flag IF (Permitir todas las interrupciones)
CMC Complementar el flag CF

Manejo de interrupciones

INT Lanza interrupción num. 3


INT n Lanza interrupción número n
INTO Da lugar a una INT 4 si OF=1
IRET Retorno de interrupción

Вам также может понравиться