Actualizado el 17 de Enero del 2019 (Publicado el 1 de Enero del 2019)
2.276 visualizaciones desde el 1 de Enero del 2019
677,0 KB
65 paginas
Creado hace 11a (29/11/2013)
(2)
Unidad 2
Modelo de Programación
del 80x86 de Intel
SISTEMAS BASADOS EN MICROPROCESADORES
Grado en Ingeniería Informática
EPS - UAM
(2)
Índice
2. Modelo de programación del 80x86 de Intel.
Familia 80x86 como caso particular.
Registros internos y arquitectura del 80x86.
2.1.
2.2
2.3. Acceso y organización de la memoria.
2.4. Modos de direccionamiento.
2.5. Directivas y operadores del ensamblador del 80x86.
2.6. Estructura de un programa en ensamblador.
2.7.
2.8. Mapa de memoria del sistema PC.
2.9.
Instrucciones del ensamblador.
Interrupciones: mecanismo y vectores de interrupción.
(2)
2.1. Familia 80x86 como caso particular
Microprocesadores aparecen en los 70 (1971-…) con 4 bits
y luego 8 bits (8085 con 64KB de memoria).
Inventados por Intel como circuitos integrados digitales y
programables para sustituir circuitos digitales cableados.
Familia 80x86 nace en 1978 con el 8086 (16 bits y 1 MB
memoria). Continúa con: 80186, 80286, 80386, 80486, …
En paralelo aparece 8088 (ordenador personal de IBM o
PC): 8086 de 8 bits.
Competidor inicial: Motorola 6800 (8 bits) y 68000 (16 bits).
Intel garantiza compatibilidad de sus microprocesadores
desde los inicios e introduce la segmentación de memoria
(segmentos de 64 KB)
Tecnología CISC vs. RISC (más actual)
(2)
2.2. Registros internos y arquitectura
del 80x86 (I)
AH
BH
CH
DH
AL
BL
CL
DL
SP
BP
SI
DI
REG. TEMPORALES
ALU
REG. FLAGS
REGISTROS
GENERALES
BUS DATOS ALU
(16 BITS)
UNIDAD
EJECUCIÓN
(EU)
BUS DIRECCIONES (20 BITS)
SUMADOR
BUS DATOS
(16 BITS)
CS
DS
SS
ES
IP
OTROS REG.
COLA
INSTRUCCIONES
BUS
MUX
LÓGICA
CONTROL
DEL
BUS
UNIDAD DE EJECUCIÓN
UNIDAD DE INTERFAZ CON EL BUS
(2)
2.2. Registros internos y arquitectura
del 80x86 (II)
Registros de datos
AX (AH-AL), BX (BH-BL), CX (CH-CL), DX (DH-DL)
(2)
2.2. Registros internos y arquitectura
del 80x86 (III)
Registros de datos
AX (AH-AL), BX (BH-BL), CX (CH-CL), DX (DH-DL)
Actúan como acumuladores en instrucciones de
transferencia, lógicas y aritméticas.
Cada uno de 16 bits, divisible en 2 registros de 8 bits.
Tareas específicas en algunos casos (para cualquier
uso si están libres):
AX: Multiplicar, dividir y operaciones de E/S.
BX: Registro base para direccionamiento indirecto
(apunta a la base de una tabla)
CX: Contador de bucles.
DX: Multiplicar, dividir, operaciones de E/S.
(2)
2.2. Registros internos y arquitectura
del 80x86 (IV)
Registros punteros: SP , BP , SI , DI
(2)
2.2. Registros internos y arquitectura
del 80x86 (V)
Registros punteros: SP , BP , SI , DI
Intervienen en el direccionamiento de memoria como
desplazamientos (offsets) respecto a las zonas de
memoria indicadas en registros de segmento.
SP (Stack Pointer): Usado junto al registro de segmento
de pila SS. Interviene en:
Llamadas a subrutinas
Interrupciones
Instrucciones de manejo de pila
BP (Base Pointer): Usado junto al registro de segmento
de pila SS. Útil para acceder a los parámetros de
subrutinas pasados por pila.
SI (Source Index): Usado para indexar tablas en
memoria (lectura). Para cualquier uso si está libre.
DI (Destination Index): Usado para indexar tablas en
memoria (escritura). Para cualquier uso si está libre.
(2)
2.2. Registros internos y arquitectura
del 80x86 (VI)
Registros de segmento: CS , SS , DS , ES
(2)
2.2. Registros internos y arquitectura
del 80x86 (VII)
Registros de segmento: CS , SS , DS , ES
Intervienen en el direccionamiento de memoria indicando
zonas de 64KB de memoria (segmentos).
CS (Code Segment): Indica el segmento de código
máquina (programa). Junto con el puntero de
instrucciones IP constituye el contador de programa.
SS (Stack Segment): Indica el segmento de pila. Junto
con SP o BP indica una posición absoluta de memoria
en la pila.
DS (Data Segment): Indica el segmento principal de
datos (variables globales).
ES (Extra Segment): Indica el segmento adicional de
datos (variable globales).
(2)
2.2. Registros internos y arquitectura
del 80x86 (VIII)
Registro puntero de instrucciones: IP
(2)
2.2. Registros internos y arquitectura
del 80x86 (IX)
Registro puntero de instrucciones: IP
Indica el desplazamiento (offset) dentro del segmento
indicado por CS donde se encuentra la siguiente
instrucción de código máquina que va a ser ejecutada
(contador de programa).
(2)
2.2. Registros internos y arquitectura
del 80x86 (X)
Registro de estado (FLAGS)
(2)
2.2. Registros internos y arquitectura
del 80x86 (XI)
Registro de estado (FLAGS)
Algunos de sus 16 bits indican información de estado
del procesador y de la última operación de la ALU.
15
14
13
12
11
10
OF DF
8
9
IF TF
7
6
S Z
5
3
4
AC
2
P
1
0
C
IF: bit de interrupciones
DF: bit de dirección
OF: bit de overflow
Z: bit de cero
S: bit de signo
TF: bit de trap
C: bit de acarreo
P: bit de paridad
AC: bit de acarreo auxiliar
Las banderas (flags) C, AC, S, P, Z y OF dependen del resultado
de la última operación ejecutada por la ALU.
La bandera IF habilita o deshabilita las interrupciones hardware.
La bandera TF habilita o deshabilita la ejecución “paso a paso”.
La bandera DF incrementa o decrementa los punteros índice en
instrucciones de cadena.
Todos los bits pueden ponerse a 0 o a 1 con instrucciones
específicas.
(2)
2.3. Acceso y organización de la memoria (I)
Memoria física de un sistema basado en 8086 organizada
como 220 posiciones de 1 byte (1 MB).
Memoria física de 1 MB dividida a nivel lógico en
“segmentos” de 64 KB.
Los segmentos empiezan en direcciones múltiplo de 16.
Dos segmentos consecutivos están separados por 16 bytes.
En un programa, las instrucciones suelen estar en un
segmento, los datos en uno o varios segmentos distintos y
la pila en otro (hay casos en que esto no se cumple).
La CPU puede acceder a la vez hasta a cuatro segmentos
distintos (registros CS, DS, ES y SS con valores distintos).
Puede haber solapamiento total o parcial de segmentos
(caso extremo: CS, DS, ES y SS con mismo valor).
El programa puede cambiar en cualquier momento el valor
de los registros de segmento.
(2)
2.3. Acceso y organización de la memoria (II)
Acceso a memoria (modo real)
Hardware: 20 bits de dirección (A19-A0)
Software: 32 bits (16 bits de Segmento y 16 bits de Offset)
DIRECCIÓN FÍSICA = Segmento x 16 + Offset
Bit 19
Bit 15
Bit 0
16 x
+
SEGMENTO
SEGMENTO
0
0
00
OFFSET
DIRECCIÓN FÍSICA
(2) 2.3. Acceso y organización de la memoria (III)
1 byte
00000h
Dirección más
baja del segmento
Registro
segmento
Offset
Dirección accedida
FFFFFh
64 KB
Máximo tamaño
del segmento
(2) 2.3. Acceso y organización de la memoria (IV)
Ejemplos de acceso a memoria (modo real)
(offset)
CS = A783h (segmento)
IP = 403Eh
Dirección física = A783h x 16 + 403Eh =
A783h x 10h + 403Eh =
A7830h + 403Eh = AB86Eh
ES = 54A3h (segmento)
DI = 1F2Bh
Dirección física = 54A30h + 1F2Bh = 5695Bh
(offset)
SS = 4675h
SP = A001h
Dirección física = 46750h + A001h = 50751h
(2)
2.3. Acceso y organización de la memoria (V)
Acceso a memoria desde programas
El acceso puede ser a un byte o dos consecutivos
(una palabra) según el registro que intervenga en la
instrucción.
Ejemplo: si previamente se han ejecutado las
siguientes instrucciones:
mov AX, 2000h
mov DS, AX
el resultado de las siguientes
operaciones es:
mov AX, [455h]
mov AX, [456h]
mov AH, [457h]
mov AL, [458h]
; AX = 2F32h
; AX = 952Fh
; AH = 95h
; AL = E4h
20455h
20456h
20457h
20458h
20459h
32
2F
95
E4
FB
(2)
2.4. Modos de direccionamiento (I)
Siete modos de direccionamiento:
Inmediato
Por registro
Directo
Indirecto
Relativo
Indexado
Implícito
Los modos directo e indirecto consisten en
“punteros” a memoria.
(2)
2.4. Modos de direccionamiento (II)
Direccionamiento inmediato
El operando fuente siempre es un valor y el destino un
registro.
Ejemplos:
mov CL, 3Fh
mov SI, 4567h
; 3Fh ⇒ CL
; 4567h ⇒ SI
Direccionamiento por registro
Ambos operandos son siempre registros.
Ejemplos:
mov DX, CX
mov BH, CL
; CX ⇒ DX
; CL ⇒ BH
(2)
2.4. Modos de direccionamiento (III)
Direccionamiento directo
El offset de la posición de memoria a la que se quiere
acceder se especifica en la instrucción. Por defecto, el
segmento lo indica DS.
Ejemplos si DS = 3000h:
mov DX, [678Ah] ; carga en DL el contenido de la posición
mov AL, [32h]
mov [800h], BL
; de memoria 3678Ah y en DH el
; contenido de la posición de memoria
; 3678Bh.
; carga en AL el contenido de la posición
; de memoria 30032h
; carga en la posición de memoria 30800h
; el contenido de BL.
(2)
2.4. Modos de direccionamiento (IV)
Direccionamiento indirecto por registro
La dirección efectiva del operando está contenida en uno
de los registros BX, BP, SI o DI.
Ejemplo:
mov AX, [BX]
Direccionamiento relativo a base
La dirección efectiva se obtiene sumando un
desplazamiento al registro BX o al BP.
Ejemplos equivalentes si offset de la TABLA es 4:
mov AX, [BX]+4
mov AX, 4[BX]
mov AX, TABLA[BX]
mov AX, [BX+4]
(2)
2.4. Modos de direccionamiento (V)
Direccionamiento indexado
La dirección efectiva se calcula sumando un
desplazamiento al contenido de SI o DI.
Ejemplos equivalentes si offset de la TABLA es 4:
mov AX, [SI]+4
mov AX, 4[SI]
mov AX, TABLA[SI]
mov AX, [SI+4]
Direccionamiento indexado a base
La dirección efectiva se obtiene sumando BX o BP con SI
o DI y/o un offset directo.
Ejemplos:
mov AX, TABLA[BX][SI]
mov AX, TABLA+[BX]+[SI]
(2)
2.4. Modos de direccionamiento (VI)
Direccionamiento relativo
Usado en saltos condicionales: El operando es un
desplazamiento de 8 bits con signo (-128 a 127)
que se suma al puntero de instrucciones IP.
Ejemplos:
jnc 26
jz etiqueta
; si la etiqueta está a una distancia
; mayor o igual que -128 y menor que 128
Direccionamiento implícito
No es necesario indicar el operando (es implícito).
Ejemplos:
cli
stc
; pone a 0 el flag de interrupciones
; p
Comentarios de: Unidad 2 Modelo de Programación del 80x86 de Intel (0)
No hay comentarios