Professional Documents
Culture Documents
FACULTAD DE INGENIERÍA
MICROPROCESADORES I
Integrantes:
18 DE JUNIO DE 2013
SERIE DE PROGRAMAS PARA EL
MICROPROCESADOR PENTIUM
OBJETIVO
INTRODUCCIÓN
El microprocesador 8086/8088
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.
Computadora
Simulador “emu8086”
Desarrollo
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
DB " ";,0DH,0AH
RESULTADO DB 30 DUP(0)
ALMACEN DB 20 DUP ( 0 )
.CODE
MOV DS,AX
MOV AH, 9
INT 21H
MOV AH,0AH
INT 21H
PROC FAR
MOV AX,@DATA
MOV DS,AX
LEA SI,CADENA
LEA DI,CONVERSION
MOV CL,0BH
JMP MINUS
MOV AL,[SI]
OR AL,00100000B
MOV [DI],AL
DEC CL
INC SI
INC DI
CMP CL,00H
JNZ MINUS
MOV AH, 9
INT 21H
MOV AH, 9
INT 21H
INT 21H
MOV AH, 9
INT 21H
MOV AH, 9
INT 21H
MOV AH, 9
INT 21H
LEA DX,CONVERSION
.EXIT
ENDS
END