Interprete_80x86
Páginas: 6 (1420 palabras)
Publicado: 17 de octubre de 2015
16 bits 80x86
Diagrama Simplificado
8
Ducto de Datos
8
Puertos
Paralelos
8
AD0-AD7
uC
Puerto
Serie
D0-D7
A8-A15
ALE
8
2
A0-A7
8
A8-A15
8
8
Latch
CS
WR
RD
RAM
CS
WR
RD
2
Memoria
Serie
Memoria
Ducto de Direcciones
MOV AX,BX
ADD AX,DX
OUT DX,AL
1
Descripción
Interprete
Memoria
Datos
Lee y Escribe
a Memoria
Memoria
Programa
Lee
Instrucciones
3Interprete
1
2
Lee y Escribe
a Registros
Registros
2
Interprete
Memoria
Datos
Lee y Escribe
a Memoria
Memoria
Programa
Lee
Instrucciones
3
Interprete
Arreglo de Bytes
1
Arreglo de Bytes
2
Lee y Escribe
a Registros
Registros
Estructura de
Registros
Interprete
Memoria
Programa
Lee
Instrucciones
1
Memoria
Datos
Decodificación
Lee y Escribe a
Memoria
Ejecución
Arreglo de Bytes
3Interprete
BYTE Codigo[ CODE_SIZE]
2
Lee y Escribe a
Registros
Arreglo de Bytes
BYTE Memoria[ MEM_SIZE]
Registros
Estructura de
Registros
Reg_t Registro[8]
/* Flags, IP, CS, DS, ES, SS */
3
Interprete
Direcciones Lógicas
SEGMENT:OFFSET
Direcciones Físicas
Memoria
Seg*10h + Desp
x = ReadMem( Seg, Desp)
Decodificación
Ejecución
Seg*10h + Desp
WriteMem( Seg, Desp, x )
Interprete
Seg*10h +Desp
Arreglo de Bytes
BYTE Memoria[ MEM_SIZE]
Registros
Registros
Generales
AH
BH
AL
CH
CL
BL
DH
Registros
Apuntadores
y de Índice
DL
SP
BP
DI
SI
CS
Registros
de
Segmento
DS
SS
ES
IP
Registros
De Banderas
Banderas
4
Instrucciones (1 o 2 bytes)
Instrucciones (2, 3 o mas bytes)
5
Instrucciones
Instrucciones
6
Instrucciones
Ejemplo:
Campos
Código
oper
Mnemónico
reg
01000000
INC AX
41h
01000 001
INC CX
47h
01000 111
40h
INC DI
Decodificación y Ejecución
Ejemplo:
switch (codigo){
case 0x40:
AX++; /* incrementa AX */
break;
case 0x41:
CX++; /* incrementa cx */
break;
:
case 0x47:
DI++; /* incrementa cx */
break;
}
7
Decodificación y Ejecución
Ejemplo:
/* a) Tener un arreglo de registros que conforman a AX, CX etc. */
T_RegistroRegistro[8];
/* b) Tener un registro de instrucción formado por campos de bits */
/* teniendo así: Codigo.oper y Codigo.reg
/* ahora si */
*/
#define INC_R16 0x08
if ( Codigo.oper == INC_R16
0x08
Registro[ Codigo.reg ]++;
)
INC Reg16
01000 reg
Esquema de Registros
Registros
Generales
Registros
Apuntadores
y de Índice
Registros
de
Segmento
AL
BL
CL
DL
AH
BH
CH
DH
SP
BP
DI
SI
CS
DS
SS
ES
IP
8Esquema de Registros
DIR. LÓGICA
CÓDIGO
MNEMÓNICO
136E:0100
136E:0102
FEC0
FEC4
INC
INC
AL
AH
136E:0108
FE060001
INC
BYTE PTR [0100]
136E:0104
FF060001
INC
WORD PTR [0100]
Declaración de Registros
#define WORD unsigned int
#define BYTE unsigned char
union u_reg
WORD
BYTE
BYTE
{
w;
L;
H;
/* Registro de 16 bits
/* Registros de 8 bits
/* Registros de 8 bits
};
*/
*/
*/
Ejemplo
:/* declarando a AX como:
*/
union u_reg AX;
w
Dir. X
L
Dir. X+1
H
Memoria
/* se puede accesar como
AX.w = 0x1234; /* 16 bits
/* 8 bits */
AX.L = 0x23;
AX.H = 0xef;
/* AL
/* AH
*/
*/
*/
*/
9
Declaración de Registros
#define WORD unsigned int
#define BYTE unsigned char
union u_reg
WORD
BYTE
BYTE
BYTE
};
w
{
w;
b[2];
L;
H;
Dir. X
/* Registro de 16 bits
/* Registros de 8 bitsEjemplo:
b[0]
b[1]
Dir. X+1
*/
*/
Memoria
/* declarando a AX como:
union u_reg AX;
*/
/* se puede accesar como
AX.w = 0x1234; /* 16 bits
*/
*/
/* 8 bits */
AX.b[0] = 0x23;
AX.b[1] = 0xef;
*/
*/
/* AL
/* AH
Declaración de Registros
#define WORD unsigned int
#define BYTE unsigned char
union u_reg {
WORD w;
BYTE b[2];
};
/* Registro de 16 bits
/* Registros de 8 bits
*/
*/
/* nuevo tipo dedato */
typedef union u_reg Registro;
/* Ejemplo de Acceso
*/
Registro AX;
AX.w = 0x1234;
AX.b[0]= 0xff;
AX.b[1]= 0x3f;
/* Como registro de 16 bits
/* Como registro de 8 bits (baja)
/* Como registro de 8 bits (alta)
*/
*/
*/
10
Declaración de Registros
#define WORD unsigned int
#define BYTE unsigned char
union u_reg {
WORD w;
BYTE b[2];
};
/* Registro de 16 bits
/* Registros de 8 bits...
Leer documento completo
Regístrate para leer el documento completo.