Introducción al 8086
Facultad de Ingeniería
Universidad de la
República
Instituto de Computación
Contenido
Generalidades 80x86
Modos de direccionamiento
Set de instrucciones
Assembler
Compilando algunos ejemplos
Microprocesadores Intel
8086/8088
Los procesadores Intel 8086 y 8088 son la base del IBM-PC y
compatibles
(8086 introducido en 1978, primer IBM-PC en 1981)
Todos los procesadores Intel, AMD y otros están basados en
el original 8086/8, y son compatibles.
En el arranque, Pentiums, Athlons etc se ven como un 8086:
Instruction Pointer apunta a FFFF0H
8086 es un procesador de 16-bit
16-bit data registers
16 or 8 bit external data bus
Algunas técnicas para optimizar la performance, por ejemplo
la Unidad de Prefetch
Segmentos: Offset memory model
Formato de datos Little-Endian
Orden de los Bytes:
Little-Endian y Big-Endian
Indican de qué forma se almacena en
memoria la secuencia de bytes que Big Little
representan un escalar multi-byte Dir Endian Endian
0 byte n byte 0
Little endian indica que el byte menos
significativo de la secuencia de bytes
será almacenado en la dirección de 1 byte n-1 byte 1
memoria menor
2 byte n-2 byte 2
En la imagen se muestra cómo una
secuencia de bytes, byten… byte0, se …
guarda en memoria en cada caso.
byte0 es el menos significativo y byten
n byte 0 byte n
es el menos significativo
8086/8088
Los accesos a memoria enlentecen el ciclo de ejecución
El 8086/8 usa una cola de instrucciones para mejorar la
performance
Mientras el procesador decodifica y ejecuta una instrucción, la
unidad de interfaz con el bus puede leer nuevas instrucciones,
pues en ese momento el bus está en desuso
El IBM PC original usa el microprocesador 8088
8088 es similar al 8086 pero tiene un bus externo de 8 bits y
una cola de instrucciones de solo 4 bytes
El bus de 8-bit reduce la performance, pero baja los costos
La arquitectura del 8086 y el 8088 se puede considerar en
conjunto
Algunos clones del PC usaban el 8086 para mejorar la
performance
Unidades funcionales del
8086/8088
Execution unit (EU) – ejecuta las instrucciones
Bus interface unit (BIU) – fetch de instructiones y operandos,
escritura de resultados
Prefetch queue: 8086/6 bytes, 8088/4 bytes
Organización Interna del 8086/8088
IP
Elementos de la BIU
Instruction Queue: la próxima instrucción u operando
puede ser leído desde memoria mientras el procesador
ejecuta la instrucción corriente
Dado que la interfaz de memoria es mucho más lenta que el
procesador, la cola de instrucciones mejora la performance
global del sistema.
Registros de Segmento:
CS, DS, SS y ES: registers de 16 bit
Usados como base para generar las direcciones de 20 bits
Permiten al 8086/8088 direccionar 1Mbyte de memoria
El programa puede utilizarlos para apuntar a diferentes
segmentos durante la ejecución
Instruction Pointer (IP) contiene el offset de la dirección de
la próxima instrucción (distancia en bytes desde la
dirección contenida en el registro CS)
Direcciones de 20 bits en el
8086/8088
16-bit Segment Base Address 0000
16-bit Offset Address
20-bit Physical Address
Construyendo un sistema
basado en el 8086/8
Los microprocesadores 8086/8 necesitan circuitos extra
para construir un sistema
Los buses de datos y direcciones se multiplexan en los
mismos pines del procesador
Se necesita lógica extra para demultiplexar direcciones y datos
y poder acceder a RAMs y ROMs
Modos de funcionamiento
Máximo
Mínimo
El Modo Máximo el 8086/8 necesita al menos los
siguientes circuitos extra: 8288 Bus Controller, 8284A
Clock Generator, 74HC373s y 74HC245s
Modos de funcionamiento
MAXIMUM MINIMUM MAXIMUM MINIMUM
MODE MODE MODE MODE
GND 1 40 Vcc GND 1 40 Vcc
AD14 AD15 A14 A15
AD13 A16,S3 A13 A16,S3
AD12 A17,S4 A12 A17,S4
AD11 A18,S5 A11 A18,S5
AD10 A19,S6 A10 A19,S6
AD9 /BHE,S7 A9 high /SS0
AD8 MN,/MX A8 MN,/MX
AD7 /RD AD7 /RD
AD6 /RQ,/GT0 HOLD AD6 /RQ,/GT0 HOLD
AD5
8086 8088
/RQ,/GT1 HLDA AD5 /RQ,/GT1 HLDA
AD4 /LOCK /WR AD4 /LOCK /WR
AD3 /S2 IO/M AD3 /S2 IO/M
AD2 /S1 DT/R AD2 /S1 DT/R
AD1 /S0 /DEN AD1 /S0 /DEN
AD0 QS0 ALE AD0 QS0 ALE
NMI QS1 /INTA NMI QS1 /INTA
INTR /TEST INTR /TEST
CLK READY CLK READY
GND 20 21 RESET GND 20 21 RESET
i8086 Circuit - Maximum Mode
Vcc CLK MRDC#
MWTC#
S0# AMWC#
CLK S1# 8288
8284A IORC#
S2# Bus
Clock READY IOWC#
Generator RESET
Controller
AIOWC#
DEN
RDY DT/R# INTA#
8086 ALE
CPU
MN/MX#
LE
OE#
BHE# 74LS373
AD15:AD0 A19:A0,
x3
ADDR/D ATA BHE#
A19:A16
INTR
DIR
En modo máximo, las señales de status EN#
(S0, S1, S2) se usan para reconstruir las 74LS245
74LS245 D15:D0
x2
señales “normales” del bus de control ADDR/Data x2
MRDC#, MWTC#, IORC#, IOWC# etc
Evolución: 80186/80188
Set de Instrucciones aumentado
Componentes del sistema “on-chip”
Clock generator
Controlador DMA
Controlador interrupciones
Timer
etc…
No utilizado en PCs
Popular en sistemas embebidos
Controladores
Hardware dedicado
Señal RESET
RESET es activa en nivel bajo. Pone al 8086/8 en
un estado definido
Limpia los registros de flags, segmento, etc
Pone la dirección de programa efectiva en 0FFFF0h
(CS=0F000h, IP=0FFF0h)
Programas en el 8086/8 siempre arrancan en FFFF0H
después de un Reset
En esta dirección deben instalarse las rutinas de
inicialización del sistema: en el PC, la ROM BIOS
Esta característica se mantiene en las últimas
generaciones de procesadores
Direccionamiento:
memoria y E/S por separado (i)
Los procesadores Intel tienen en espacio de
direccionamiento de E/S separado de la memoria principal
(Código y Datos)
Decodificación de direcciones de dispositivos de E/S por
separado
Uso de las señales IOR# and IOW#
Se corresponden con instrucciones separadas para acceder
la E/S y la memoria
MOV AL, [BX] ; acceso a memoria
IN AL, 2Ch ; acceso a E/S
Algunos procesadores tienen un espacio de direcciones
unificado. Los dispositivos de E/S son decodificados en el
mapa de memoria principal
“E/S mapeada en memoria”
Direccionamiento:
memoria y E/S por separado (ii)
Ventajas de la E/S mapeada en memoria
Dispositivos de E/S accedidos por instrucciones
normales - no se necesitan instrucciones separadas
Se reduce el tamaño del set de instrucciones
No se necesitan pines especiales (IOR#, IOW#)
Ventajas de espacios de direccionamiento
separados
Todo el mapa de direcciones disponible para memoria
La E/S puede usar instrucciones más pequeñas y
rápidas
Fácil distinguir accesos de E/S en lenguaje
ensamblador
Menos hardware para decodificar E/S.
Interrupciones
Mecanismo que permite interrumpir la secuencia normal de
procesamiento de la CPU ante condiciones particulares
Pueden ser de alguna de las siguientes clases:
Programa
• Ej. overflow, división por cero, protección de memoria
Timer
• Generado por un temporizador interno del procesador
• Usado en pre-emptive multi-tasking
E/S
• Provocada por el controlador de E/S
Fallo de Hardware
• Ej. Error de paridad de memoria
Ciclo de Interrupciones
Se agrega al ciclo de instrucción
Procesador chequea por la interrupción
Indicado por una señal de interrupción
Si no hay interrupción, fetch próxima instrucción
Si hay una interrupción pendiente:
Suspender ejecución del programa corriente
Salvar contexto
Hacer que PC apunte a la dirección de inicio del manejador de
la interrupción
Procesar interrupción
Restaurar contexto y continuar el programa interrumpido
Transferencia de Control vía
Interrupciones
Interrupciones
Tipos
Hardware: dispositivos de entrada salida
Internas: división entre cero
Software: llamadas al sistema
No enmascarables.
Cada interrupción lleva asociado un
número que identifica al servicio que se
debe invocar.
Vector de Interrupciones
Las localizaciones de memoria
00000H a 003FFH están reservadas
para las interrupciones
Existen 256 tipos posibles de
interrupciones
Cada Handler o Rutina de Servicio de
Interrupción está direccionada por un
puntero de 4 bytes: 16 bits de
segmento y 16 bits de offset
Las rutinas y los punteros deben
instalarse antes de habilitar las
interrupciones
Servicios de la BIOS
Servicios del Sistema Operativo
Interrupciones enmascarables
y no enmascarables
Las interrupciones pueden enmascararse globalmente
usando la Interrupt Enable Flag (IE o I)
IE es seteada por la instrucción STI y reseteada mediante
CLI
Interrupciones no enmascarables (Non Maskable
Interrupts-NMI) son prioritarias y como su nombre indica
NO se pueden enmascarar
Uso de la NMI
Parity Error
Power fail
Etc…
Ejemplo de NMI
Power Fail
Monitor
NMI
Parity Error CPU
Detector
INTR
I/O
Device
Generalidades 8086/8080
Los bytes y palabras pueden residir en cualquier lugar de la
memoria (no es necesario que estén alineados)
Puede operar con números
Binarios (con o sin signo de 8 ó 16 bits)
BCD
Dispone de 92 instrucciones.
Existen 7 modos de direccionamiento.
Frecuencia típica
4,77 MHz (8080)
8 MHz (8086)
Las instrucciones más rápidas se ejecutan en dos ciclos de
reloj y las lentas en 206 ciclos.
Se pueden direccionar hasta 64K puertos de E/S.
Registros (i)
Datos o almacenamiento temporal
AX, acumulador.
BX, base.
CX, contador.
DX, dato.
Registro Byte Superior Byte Inferior
AX AH AL
BX BH BL
CX CH CL
DX DH DL
FEDCBA98 76543210 Bit hex
Registros (ii)
Segmento
CS, código
DS, dato.
SS, pila.
ES, extra.
Punteros a pila
SP, tope de la pila.
BP, base a la pila.
Registros (iii)
Registros de índice
SI, índice origen.
DI, índice destino.
Puntero a instrucción
Banderas
Modos de direccionamiento (i)
Se entiende por modos de direccionamiento a las formas
diferentes que pueden tomar los parámetros de las
instrucciones del procesador.
Distinguiremos fundamentalmente cuatro modos diferentes:
REGISTRO
• Un parámetro que direcciona a un registro está utilizando el
modo de direccionamiento REGISTRO.
• Ej: MOV Ax,Bx
• En este ejemplo los dos parámetros direccionan un registro.
VALOR o INMEDIATO
• Utilizado cuando se hace referencia a un valor constante que
se codifica junto con la instrucción. Es decir dicho parámetro
representa a su valor y no a una dirección de memoria o un
registro que lo contiene.
• Ej: MOV Ax,500
Modos de direccionamiento (ii)
DIRECTO
• Se utiliza el modo directo cuando se referencia a una dirección de
memoria y la misma está codificada junto con la instrucción.
• Ej: MOV AL,[127]
• En este ejemplo el offset de la dirección de memoria se codifica junto
con la instrucción y el segmento se asume a DS. Si MEMORIA es un
array de bytes que representa a la memoria:
• AL := MEMORIA[ DS:127 ]
INDIRECTO
• Se utiliza el modo indirecto cuando se referencia a una dirección de
memoria a través de uno o varios registros
• Ej: MOV AL,[Bx]
• Aquí el offset de la dirección de memoria esta contenido en el
registro Bx y al igual que el caso anterior como no se especifica el
segmento se asume DS. Ejemplo:
• AL := MEMORIA [DS:Bx]
Formato de instrucción (i)
+---+---+---+---+---+---+---+---+
| Código de Operación | D | W |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| MOD | REG | REG/MEM |
+---+---+---+---+---+---+---+---+
+---------------------+ +---------------------+
| byte/palabra despl. | | byte/palabra inmed. |
+---------------------+ +---------------------+
Formato de instrucción (ii)
El código de operación ocupa 6 bits.
D indica que el operando destino está en el campo
registro.
W indica que los operandos son de tipo palabra.
MOD indica el modo de direccionamiento
00 sin desplazamiento.
01 desplazamiento de 8 bits
10 desplazamiento de 16 bits
11 registro
REG indica el registro involucrado en la instrucción
R/M, en el caso de modo registro (MOD=11) se codifica
igual que el campo REG; en caso contrario se indica la
forma en que se direcciona la memoria
Set de Instrucciones
Aritméticas
Lógicas
Desplazamiento
Manejo de Flags
Bifurcación Incondicional
Bifurcación Condicional
Interrupciones
Manejo de Stack
Ver cartilla del curso
Constantes
Valores binarios, tiras de ceros y unos.
Terminan con b o B.
Ej: 100011 b.
Valores octales.
Terminan con o, O, q o Q.
Ej: 664 o.
Valores hexadecimales
Empiezan con 0..9.
Terminan con h o H.
Ejemplo: 0FFFh
Valores decimales.
Strings, secuencias de caracteres ASCII.
Van entre comillas simples.
‘Hola mundo’.
Operadores
Operador +, -, *, /, mod, shl, shr, and, or y xor.
Formato: valor1 oper valor2
Ejemplos
• 75+25
• 80*25
• 1002/123
• 1100001 SHR 2
Operador not
Formato: oper valor
Ejemplo: not 1100001b
Operador offset y seg
Formato: oper {etiqueta|variable}
Directivas (1/5)
La directiva EQU
La forma de esta directiva es:
identificador EQU expresión
Ejemplo:
NULL EQU 0
TAM_ELEM EQU 4*8
interElem EQU CX
MASK EQU 100010 b
MASK_2 EQU MASK SHR 2
Directivas (2/5)
Las directivas DB, DW, DDW y DUP
La forma de estas directivas es:
etiqueta {DB|DW|DDW} expresión1,
expresión2,...
cantidad dup (valor)
Ejemplo:
iterElem DW 0
vectorChico DB 1,2,3,4,5,6
vectorGrande DB 1024 dup(0)
...
mov ax,[iterElem]
mov bl,[vectorChico+2]
Directivas (3/5)
La directiva MACRO
La forma de esta directiva es:
nombreMacro MACRO [parametro[,parametro...]]
instrucciones
ENDM
Ejemplo:
sqr MACRO registro
mov AX,registro
mul registro
mov registro,AX
ENDM
Directivas (4/5)
Las directivas byte ptr y word ptr
La forma de esta directiva es:
{byte|word} ptr elemento
Ejemplo:
mov byte ptr [ES:BX], 0
mul word ptr [DI]
Directivas (5/5)
La directiva PROC
La forma de esta directiva es:
nombreProc PROC [NEAR|FAR]
La directiva ENDP
La forma de esta directiva es:
nombreProc ENDP
Definición de un procedimiento:
nombreProc PROC atributo
…
nombreProc ENDP
Instrucciones (1/2)
Es una secuencia de 1 a 6 bytes.
Formato
[etiqueta] nombreInstruccion [operandos] [comentarios]
Etiqueta (i)
• Nombre simbólico que referencia la primera posición
de la instrucción.
• Puede estar formada por
• Letra A a Z.
• Números 0 a 9.
• Caracteres especiales @ - . $.
Instrucciones (2/2)
Etiqueta (ii)
Los comentarios comienzan con un ‘;’
Acceso a estructuras de datos en
memoria (1/3)
Las variables que se definen contiguas en el
programa aparecen contiguas en memoria. Cada
una de ellas ocupa tantos bytes como sean
necesario por su tipo.
Dirección de
Ejemplo: memoria
iterador n
(baja)
iterador:integer; iterador n+1
(alta)
puerto:byte;
puerto n+2
…
… n+3
Acceso a estructuras de datos en
memoria (2/3)
Los campos de una variable de tipo estructurado se
almacenan en posiciones contiguas de memoria en el
orden en que aparecen declaradas y ocupando tantos
bytes como sean necesarios para alojar al tipo del campo.
Ejemplo:
Dirección de
type nodo= memoria
dato (baja) n
record
dato:integer;
hijoDer:byte; dato (alta) n+1
hijoIzq:byte;
end hijoDer n+2
hijoIzq n+3
Acceso a estructuras de datos en
memoria (3/3)
Los elementos de una variable de tipo array se almacenan
en posiciones contiguas de memoria en el orden en que
aparecen declaradas.
Ejemplo:
type arbol=array[0..(MAX_NODOS-1)] of nodo;
dirección Índice dirección Índice
dato (baja) n dato (baja) n+i*4
dato (alta) n+1 0 dato (alta) n+i*4+1 i
hijoDer n+2 hijoDer n+i*4+2
hijoIzq n+3 hijoIzq n+i*4 3
dato (baja) n+4
dato (alta) n+5
1
hijoDer n+6
hijoIzq n+7
...
Acceso a memoria (1/3)
Todos las direcciones se especifica como direcciones
segmentadas (segmento:desplazamiento).
El desplazamiento se define según la expresión:
{Bx|Bp}[+{Si|Di}][+desplazamiento]|
{Si|Di}[+desplazamiento]|
desplazamiento
Ejemplos de desplazamientos:
• BX
• BX+DI
• BX+SI+2
Ejemplos de direcciones segmentadas:
• ES:[BP+SI]
• [BP+4]
Las direcciones segmentadas son traducidas automáticamente
por el hardware multiplicando el segmento por 16 y luego
sumando el desplazamiento.
Acceso a memoria (2/3)
Segmentos utilizados
Acceso a memoria (3/3)
Desde la perspectiva del programador
Las direcciones son siempre segmentadas.
Nunca puede especificar una dirección real de 20 bits.
El microprocesador 8086 permite que a lo sumo uno de los
operandos de la mayoría de las instrucciones esté
almacenado en memoria.
Ejemplos:
inc [bp]
mov [bx],ax
xor [bx],al
mov [bx],[bx+2] Prohibido
Instrucciones assembler
Formato: código op1, op2
Tipo Args: indica la forma puede tomar cada parámetro
i, operando inmediato ( 1 o 2 bytes )
d , desplazamiento inmediato ( 1 byte )
r, registro de uso general ( 8 o 16 bits )
R, registro de uso general ( 16 bits )
m, palabra de memoria ( 1 o 2 bytes )
M, palabra de memoria ( 2 bytes )
CL, el nombre de un registro en particular
Lógica: pseudo código con la lógica de la instrucción.
Descripción: semántica de la instrucción.
Banderas:
X, afecta apropiadamente el valor de la flag.
?, el valor de la flag luego es indeterminado
-, no afecta el valor de flag
ADD
ADC, SUB y SBB
MUL
DIV
INC
DEC, CBW (expande signo de AL a AH) y NOT
CMP
AND, OR, XOR y NOT.
SHR
SHL, SAR, ROL y ROR.
IN
OUT y MOV
CLC
STC, CLI y STI.
CALL y RET
JMP
JC (JB)
JA, JNB, JNA, JE, JNE, JG, JNG, JO, JNO, JS y JNS.
PUSH y POP
PUSHF y POPF
Instrucciones prohibidas
No permitido
mul 4
mov ES,4
mov AX,[BX*4]
mov AX,BX*4
mov AX,BX+1
puhs BL
push 4
mov BL,AX
Compilado de estructuras de control (1/2)
if-then-else
Alto nivel Asembler
if (i<>0) then cmp i,0
{bloque del if} je else
else ; aquí va el bloque que
{bloque del else} ; corresponde al then
jmp finIf
else:
; aquí va el bloque que
; corresponde al else
finIf:
Compilado de estructuras de control (2/2)
while
Alto nivel Asembler
while (i<n) do while:
{bloque del while} cmp i,n
jae finWhile
; aquí va el bloque que
; corresponde al cuerpo
; del while
jmp while
finWhile:
Compilado una función (1/3)
La función len retorna el largo de un string.
Alto nivel:
String=array[0..(LARGO_MAXIMO)] of byte;
function len(str: String):integer;
iterStr: integer;
begin
iterStr:=0;
while (str[iterStr]<>NULL) do
iterStr:=iterStr+1;
len:=iterStr;
end
Compilado una función (2/3)
Asembler
NULL EQU 0
; el desplazamiento de str viene en bx
; el resultado se devuelve en di
len proc
xor di,di
while:
cmp byte prt [bx+di],NULL
je fin
inc di
jmp while
fin:
ret
len endp
Compilado una función (3/3)
Invocando a la función
miString db ‘hola mundo’
db NULL
…
mov bx, offset miString
call len
cmp di, …
;el string esta en la ;el string esta en la
;direccion segmentada 100:1000 ;direccion absoluta 0x98765
mov bx,1000 mov bx,5
mov ax,100 mov ax,9876
mov ds,ax mov ds,ax
call len call len
Referencias
8088-8086/8087 Programación
Ensamblador en entorno MS DOS, Miguel
Angel Rodriguez-Roselló, Anaya, 1988.
Art of Assembly Language,
http://webster.cs.ucr.edu/AoA/DOS/AoAD
osIndex.html
Preguntas