You are on page 1of 12

UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO

FACULTAD DE INGENIERÍA

MICROPROCESADORES I

SERIE DE PROGRAMAS PARA EL


MICROPROCESADOR PENTIUM

Integrantes:

CASTAÑEDA BARRERA EDUARDO

HERNÁNDEZ JACINTO PASTOR

LEONARDO GONZÁLEZ CHRISTIAN RAMÓN

MARTÍNEZ PADRON DANIEL STING

MOTA CARMONA JUAN RAMÓN

SERNA HERNÁNDEZ RAÚL ALEJANDRO

18 DE JUNIO DE 2013
SERIE DE PROGRAMAS PARA EL
MICROPROCESADOR PENTIUM

OBJETIVO

Que el alumno se familiariza con el set de instrucciones del microprocesador Intel


8086, así como de sus registros y lógica de control para la implementación de una
serie de programas mediante el simulador “emu8086”.

INTRODUCCIÓN

El microprocesador 8086/8088

El Intel 8086 es un microprocesador cuya arquitectura está diseñada para transferir 16


bits a la vez en el mismo bus. Junto con una cola de instrucciones de de 6 bytes. Entre
Sus características destacan el bus de direcciones de 20 bits, con lo que pueden
direccionar hasta 1 Megabyte de memoria RAM, y hacer el manejo de memoria en
forma segmentada en bloques de 64K bytes. Para esto cuenta con 4 registros de
segmento de 16 bits cada uno (CS, SS, DS y ES) y con registros de 16 bits
como offset (IP, SP, DI y SI principalmente).

El 8086 tiene 2 procesadores conectados internamente, como se puede apreciar en la


Figura 1, éstos son:

 EU: Unidad de ejecución (Execution Unit).


 BIU: Unidad de interfaz con el Bus (Bus Interface Unit).

Figura 1. Diagrama de bloques de Intel 8086

La unidad de ejecución (EU) se encarga de realizar las operaciones aritméticas y


lógicas, además de proporcionar las direcciones lógicas al BIU --una dirección lógica
está formada de dos direcciones, la primera indica el segmento en el cual se está
trabajando y la otra indica el offset, o desplazamiento, de este segmento; esto
es segment:offset.

La EU tiene una unidad aritmética lógica (ALU) de 16 bits, un registro de banderas y


un conjunto de registros de propósito general. El registro de banderas contiene 6
banderas de estado (que la EU manipula para indicar el estado del resultado de una
operación lógica o aritmética) y 3 banderas de control que se pueden manipular por los
programas para alterar las operaciones del procesador.

 Banderas de Estado
 Carry Flag
 Parity Flag
 Auxiliarity Carry Flag
 Zero Flag
 Sign Flag
 Overflow Flag

 Banderas de Control
 Interrupt Enable Flag
 Direction Flag
 Trap Flag

Todos los registros y buses de datos en la EU tienen 16 bits de longitud para obtener
mayor rapidez en la transferencia interna. La EU cuenta con 8 registros de 16 bits que
se pueden utilizar para realizar computaciones. Cuatro de estos registros componen el
grupo de datos, estos son los registros acumulador (AX), base (BX), contador (CX) y
dato (DX). Además estos cuatro registros se pueden trabajar como dos registros de 8
bits cada uno. Así, los registros de datos se pueden trabajar con su parte alta (AH, BH,
CH y DH) o con su parte baja (AL, BL, CL y DL). Los siguientes dos registros
generales, el apuntador de pila SP y la base de la pila BP constituyen el grupo de
apuntadores y se encargan de manipular la pila. Los dos últimos registros generales,
el índice fuente SI y el índice destino DI forman el grupo de registros de índice y se
utilizan para operaciones de cadenas. Las direcciones que maneja el EU son de 16
bits de longitud. La BIU se encarga de relocalizar estas direcciones para que la EU
pueda accesar completamente el megabyte del espacio de direcciones.

La unidad de interfaz con el Bus (BIU) es la responsables de la comunicación externa


del procesador. Esta unidad de proceso se encarga de traducir las direcciones lógicas
a direcciones físicas de la memoria con ayuda de los registros de segmento DS, SS,
ES, CS e IP. Para convertir una dirección lógica en una dirección física el BIU corre el
valor del registro de segmento 4 posiciones a la izquierda (que es equivalente a
multiplicar por 16h) y suma el valor del offset para obtener un valor de 20 bits
necesarios.

Los segmentos en la memoria pueden estar translapados, contiguos o disjuntos. El


8086 trabaja con un modelo de memoria circular, esto es, cuando la operación de
translado de memoria lógica a memoria física sobrepasa el megabyte de memoria,
entonces se direcciona la parte inicial de la memoria física.

La dirección de la siguiente instrucción que se ejecutará es CS:IP (Code Segment:


Instruction Pointer). Para incrementar la eficiencia, en períodos donde la EU está
ocupada ejecutando instrucciones, el BIU se adelanta a una petición de intrucción del
EU y busca más instrucciones de la memoria. Las instrucciones se almacenan en una
cola de instrucciones de 4 bytes para el 8088 y 6 bytes para el 8086. Bajo muchas
circunstancias las colas contienen al menos 1 byte instrucción y el EU no tiene que
esperar a que se busquen nuevas instrucciones. Las instrucciones almacenadas en la
cola son adyacentes en la memoria, así, cuando se ejecuta una instrucción que
transfiere el control a otra localidad el BIU limpia la cola y busca las nuevas
instrucciones desde la nueva dirección.

El 8088/8086 tienen un sistema de interrupciones simple y versátil, estos procesadores


pueden manejar hasta 256 interrupciones diferentes. Las entradas de las
interrupciones se encuentran almacenadas el vector de interrupciones en la parte baja
de la memoria. A cada interrupción se le asocia una doble palabra. Cada palabra doble
corresponde al CS:IP de la subrutina que la interrupción invoca. Las primeras cinco
interrupciones se utilizan para los siguientes errores: división por cero, paso sencillo
(trap), interrupción no enmascarable, punto de ruptura y sobreflujo. El 8086 no
distingue entre las interrupciones generadas por hardware y por las interrupciones
generadas por la instrucción INT.

MATERIAL Y EQUIPO UTILIZADO

 Computadora
 Simulador “emu8086”

Desarrollo

Se procedió a realizar los programas en el simulador “emu8086”. A


continuación se muestran los programas solicitados junto con el código realizado.

1.- Realizar un programa que cuente de manera cíclica números del 00h al 20h, y
presentarlos en la pantalla de manera decimal y cuando presione la tecla “ESC”
termine de contar.

.MODEL SMALL
.STACK
.DATA
INSTRUCC DB "PRESIONA ESC PARA SALIR DEL CICLO:",0DH,0AH
DB " ",0DH,0AH,'$'
.CODE
CONTADOR:
MOV AX,@DATA
MOV DS,AX
MOV DX, OFFSET INSTRUCC
MOV AH, 9
INT 21H
INICIO: MOV AX,00D
SIG: CALL SALIDA
CALL CARACDEC
INC AX
CMP AX,21D
JNZ SIG
MOV AH,02H
MOV DL,0AH
INT 21H
JMP INICIO
SALIR: MOV AH,4CH
INT 21H
CARACDEC PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR CX,CX
MOV BX,10D
LOOP1:
XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JNZ LOOP1
MOV AH,02
LOOP2:
POP DX
ADD DL,48
INT 21H
DEC CX
JNZ LOOP2
MOV AH,02h
MOV DL,32D
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
CARACDEC ENDP
SALIDA PROC
PUSH AX
MOV AH,1
INT 16H
CMP AL,1BH
JZ SALIR
POP AX
RET
SALIDA ENDP
END CONTADOR

2.- Hacer un programa que pida al usuario dos números, y éste como resultado
imprima en la pantalla la suma, la resta, la división y la multiplicación de esos
números.

.MODEL SMALL
.STACK
.DATA
N1 DB "SUMA ",0DH,0AH
DB "RESTA ",0DH,0AH
DB "MULTIPLICACION ",0DH,0AH
DB "DIVISION ",0DH,0AH
DB "INGRESA UN NUMERO DEL 0 AL 8",0DH,0AH
DB " ",0DH,0AH,'$'
N2 DB "INGRESA UN NUMERO DEL 0 AL 9",0DH,0AH
DB "MAYOR QUE EL PRIMERO",0DH,0AH
DB " ",0DH,0AH,'$'
ESPACIO DB " ",0DH,0AH,'$'
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV DX, OFFSET N1
MOV AH, 9
INT 21H
MOV AH,01H ;Leer caracter desde teclado
INT 21H ;Lee primer caracter
SUB AL,30H ;Resta 30H para obtener primer valor
MOV BL,AL ;Guardar valor en la variable var1
MOV DX, OFFSET ESPACIO
MOV AH, 9
INT 21H
MOV DX, OFFSET N2
MOV AH, 9
INT 21H
MOV AH,01H ;Leer caracter desde teclado
INT 21H ;Lee segundo caracter
SUB AL,30H ;Resta 30H para obtener segundo valor
CALL ENTER
CALL SUMA
CALL RESTA
CALL MULTI
CALL DIVI
MOV AH,4CH
INT 21H
SUMA PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
ADD AL,BL
XOR AH, AH ;PONGO EL BYTE DE MAYOR PESO A CERO.
MOV BH, 10 ;VOY A DIVIDIR ENTRE 10.
DIV BH
MOV BH, AH ;GUARDO EL RESTO DE LA DIVISION.
CMP AL, 0 ;SI EL RESULTADO ES CERO, ESTAMOS ANTE UN NUMERO DE UNA SOLA CIFRA.
JE SEGUND ;POR LO TANTO, NO IMPRIMO LA PRIMERA YA QUE ES UN CERO.
MOV DL,AL ;PONGO EN DL EL NUMERO A IMPRIMIR
ADD DL,30H ;AGREGO 30 (48DEC) PARA OBTENER EL CARACTER
MOV AH,02H ;FUNCION PARA IMPRIMIR UN CARACTER EN PANTALLA
INT 21H ;IMPRIMO EL RESTO DE LA DIVISION:
SEGUND:
MOV DL, BH
ADD DL, 30H
MOV AH, 02H
INT 21H
CALL ENTER
POP DX
POP CX
POP BX
POP AX
RET
SUMA ENDP
RESTA PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
SUB AL,BL
XOR AH, AH ;PONGO EL BYTE DE MAYOR PESO A CERO.
MOV BH, 10 ;VOY A DIVIDIR ENTRE 10.
DIV BH
MOV BH, AH ;GUARDO EL RESTO DE LA DIVISION.
CMP AL, 0 ;SI EL RESULTADO ES CERO, ESTAMOS ANTE UN NUMERO DE UNA SOLA CIFRA.
JE SEGUN ;POR LO TANTO, NO IMPRIMO LA PRIMERA YA QUE ES UN CERO.
MOV DL,AL ;PONGO EN DL EL NUMERO A IMPRIMIR
ADD DL,30H ;AGREGO 30 (48DEC) PARA OBTENER EL CARACTER
MOV AH,02H ;FUNCION PARA IMPRIMIR UN CARACTER EN PANTALLA
INT 21H ;IMPRIMO EL RESTO DE LA DIVISION:
SEGUN:
MOV DL, BH
ADD DL, 30H
MOV AH, 02H
INT 21H
CALL ENTER
POP DX
POP CX
POP BX
POP AX
RET
RESTA ENDP
MULTI PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MUL BX
XOR AH, AH ;PONGO EL BYTE DE MAYOR PESO A CERO.
MOV BH, 10 ;VOY A DIVIDIR ENTRE 10.
DIV BH
MOV BH, AH ;GUARDO EL RESTO DE LA DIVISION.
CMP AL, 0 ;SI EL RESULTADO ES CERO, ESTAMOS ANTE UN NUMERO DE UNA SOLA CIFRA.
JE SEGU ;POR LO TANTO, NO IMPRIMO LA PRIMERA YA QUE ES UN CERO.
MOV DL,AL ;PONGO EN DL EL NUMERO A IMPRIMIR
ADD DL,30H ;AGREGO 30 (48DEC) PARA OBTENER EL CARACTER
MOV AH,02H ;FUNCION PARA IMPRIMIR UN CARACTER EN PANTALLA
INT 21H ;IMPRIMO EL RESTO DE LA DIVISION:
SEGU:
MOV DL, BH
ADD DL, 30H
MOV AH, 02H
INT 21H
CALL ENTER
POP DX
POP CX
POP BX
POP AX
RET
MULTI ENDP
DIVI PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL,AL
MOV AL,BL
DIV DX
XOR AH, AH ;PONGO EL BYTE DE MAYOR PESO A CERO.
MOV BH, 10 ;VOY A DIVIDIR ENTRE 10.
DIV BH
MOV BH, AH ;GUARDO EL RESTO DE LA DIVISION.
CMP AL, 0 ;SI EL RESULTADO ES CERO, ESTAMOS ANTE UN NUMERO DE UNA SOLA CIFRA.
JE SEG ;POR LO TANTO, NO IMPRIMO LA PRIMERA YA QUE ES UN CERO.
MOV DL,AL ;PONGO EN DL EL NUMERO A IMPRIMIR
ADD DL,30H ; AGREGO 30 (48DEC) PARA OBTENER EL CARACTER
MOV AH,02H ;FUNCION PARA IMPRIMIR UN CARACTER EN PANTALLA
INT 21H ;IMPRIMO EL RESTO DE LA DIVISION:
SEG:
MOV DL, BH
ADD DL, 30H
MOV AH, 02H
INT 21H
CALL ENTER
POP DX
POP CX
POP BX
POP AX
RET
DIVI ENDP
ENTER PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DX, OFFSET ESPACIO
MOV AH, 9
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
ENTER ENDP
END START

3.- Solicitar al usuario que escriba caracteres, detectar estos caracteres e imprimirlos en la
pantalla.

ORG 100H
;DESPLEGAR INSTRUCCIONES
MOV DX, OFFSET INSTRUCC
MOV AH, 9
INT 21H
TECLA:
;BUSQUEDA DE PRESION DE TECLA
;EN EL PUERTO
MOV AH, 1
INT 16H
JZ TECLA
;LEER TECLA PRESIONADA
MOV AH, 0
INT 16H
;PONER LA TECLA EN PANTALLA
MOV AH, 0EH
INT 10H
; SALIDA DEL PROGRAMA
CMP AL, 1BH
JZ SALIR
JMP TECLA
;============================
SALIR:
RET
INSTRUCC DB "Escribe un caracter", 0DH,0AH
DB "Sera puesto en pantalla", 0DH,0AH
DB "ESC para salir del programa", 0DH,0AH
DB "", 0DH,0AH, "$"
END

4.- Realizar un programa que solicite al usuario teclear una cadena de datos en minúsculas y
convertirlas en mayúsculas, mostrar en la pantalla lo tecleado por el usuario y la conversión.

.MODEL SMALL

.STACK 100H

.DATA

MENSAJE DB "INGRESE CADENA DE 10 CARARACTERES MAXIMO (PRESIONE ENTER AL FINALIZAR)",0DH,0AH

DB " ";,0DH,0AH

RESULTADO DB 30 DUP(0)

ALMACEN DB 20 DUP ( 0 )

CADENA DB 11 ,?,11 DUP(?),'$'

CONVERSION DB 11 ,?,11 DUP(?),'$'

ESPACIO DB " ",0DH,0AH,'$'

MAYUS DB " MAYUSCULAS",0DH,0AH,'$'

MINUS1 DB " MINUSCULAS",0DH,0AH,'$'

.CODE

INSTRUCC: MOV AX,@DATA ;Rutina para desplegar instrucciones

MOV DS,AX

MOV DX, OFFSET MENSAJE

MOV AH, 9

INT 21H

MOV AH,0AH

MOV DX,OFFSET CADENA

INT 21H

PROC FAR

MOV AX,@DATA

MOV DS,AX

LEA SI,CADENA

LEA DI,CONVERSION

MOV CL,0BH
JMP MINUS

MINUS: ;Conversión a minúsculas

MOV AL,[SI]

OR AL,00100000B

MOV [DI],AL

DEC CL

INC SI

INC DI

CMP CL,00H

JNZ MINUS

MOV AH, 9

MOV DX, OFFSET ESPACIO

INT 21H

MOV AH, 9

MOV DX, OFFSET MAYUS

INT 21H

LEA DX,CADENA ;Posicionar lo que se quiere leer

MOV AH,09H ;iNTRUCCIÓN PARA MADAR DX A LA PANTALLA

INT 21H

MOV AH, 9

MOV DX, OFFSET ESPACIO

INT 21H

MOV AH, 9

MOV DX, OFFSET MINUS1

INT 21H

MOV AH, 9

MOV DX, OFFSET ESPACIO

INT 21H

LEA DX,CONVERSION

MOV AH,09H ;INSTRUCCIÓN PARA MADAR DX A LA PANTALLA


INT 21H

.EXIT

ENDS

END

You might also like