Está en la página 1de 10

UNIVERSIDAD NACIONAL DE SAN AGUSTIN

FACULTAD INGENIERA DE PRODUCCIÓN


Y SERVICIOS

ESCUELA PROFESIONAL DE INGENIERA DE


SISTEMAS

CURSO: ARQUITECTURA DE
COMPUTADORAS

DOCENTE: ING. PEDRO RODRIGUEZ

PROPIO:
-SONCCO CHUTAYA FREDY
Informe de mi Programa en Emu8086
Tipo de programa: Juego
Introducción:
Este programa consiste en adivinar un número almacenado en nuestro programa, para esto el
usuario tendrá que ingresar el número que él cree que sea correcto. Y Nuestro programa le
brindara respuestas como; El número buscado es mayor o menor; de esta manera pueda llegar
al número correcto.

Recibirá otro mensaje si acierta con el numero buscando. Automáticamente Se le preguntara al


Usuario si desea continuar jugando (y/n).

Si se Escoge la opción el programa se seguirá ejecutando caso contrario el programa culminara.

Código fuente y breve explicación del Programa:


En nuestras tres primeras líneas de código: son instrucciones del modelo de memoria, segmento
de banderas, segmentos de datos y segmentos de Código respectivamente.

.model small ; Modelo de Memoria.


.stack 100h ; Segmentos de banderas.
.data ; Segmentos de datos.
//Declaración de variables

.code ; Segmentos de código.

Las siguientes instrucciones corresponden a la declaración de todas las variables utilizadas en


nuestro programa.

I. Constantes:
- CR y LF
II. Variables:
- number: esta variable será el número que el usuario debe adivinar.
- Guess: Guardara el numero ingresado por el usuario.
- erroChk: Esta variable la utilizaremos para comparar y verificar que guess no esté
fuera de rango.
III. Mensajes:
- Prompt, LessMsg, MoreMsg, equalMsg, OverflowMsg y retry.
number db 51d ;variable 'number' Se almacena el valor aleatorio
;Declaración de Constantes
CR equ 13d
LF equ 10d

;Mensajes que dará nuestro programa cuando se esté ejecutando


prompt db CR, LF,'Ingrese numero : $'
lessMsg db CR, LF,'El numero buscado es Menor','$'
moreMsg db CR, LF,'El numero buscado es Mayor ', '$'
equalMsg db CR, LF,'El numero es Correcto!', '$'
overflowMsg db CR, LF,'Error - Numero fuera de rango', '$'
retry db CR, LF,'Continuar [y/n] ? ' ,'$'

guess db 0d ;Variable guardara el valor introducido por el usuario


errorChk db 0d ;Variable se utilizara para comparar si el numero introducido esta
Fuera de rango.

param label Byte

Función start:
- Las primeras 4 líneas de código a los registros ax, bx, cx y dx,se les da el valor de 0.
- Las siguientes líneas de código realizamos movimientos donde guardaremos el valor
de nuestras variables creadas anteriormente en nuestros registros mencionados.

start: ; Inicio de START


MOV ax, 0h
MOV bx, 0h
MOV cx, 0h
MOV dx, 0h

MOV BX, OFFSET guess ; obtener la dirección de la variable guess en BX.


MOV BYTE PTR [BX], 0d ; establecer 'guess' a 0 (decimal) // BYTE PTR valor de 8 bits

MOV BX, OFFSET errorChk ; obtener la dirección de la variable errorChk en BX.


MOV BYTE PTR [BX], 0d ; establecer 'errorChk' a 0 (decimal) // BYTE PTR valor de 8 bits

MOV ax, @data ; carga en AX la dirección del segmento de datos


MOV ds, ax ; mueve la dirección al registro de segmento por medio de AX
MOV dx, offset prompt ; Carga prompt en DX

MOV ah, 9h ; Escribe cadena a STDOUT en ah


INT 21h ; Interrupción ( para DOS)

MOV cl, 0h ; Carga en CL 0 (Contador)


MOV dx, 0h ; Carga en DX 0 (Datos registro utilizado para almacenar la entrada
del usuario)
; END START
Función while:
- Esta función se encarga de leer la entrada del usuario donde primero se valida que
no superen los 5 dígitos para comparar usa el registro CL (que sería nuestro
contador).
- Después se procede a preguntar si la última tecla que el usuario presiono sea
‘ENTER’, si es así se salta a la función ‘endwhile’. Caso contrario pasara a la siguiente
instrucción.
- Las siguientes instrucciones se encargan de almacenar el valor ingresado por el
usuario en DL.
- Se incrementa en 1 a nuestro Contador que es CL.
- Finalmente hace un salto hacia la misma función.
- Para salir de esta función el usuario tendría que presionar la tecla ENTER.

; -- leyendo la entrada del usuario


while:

CMP cl, 5d ;Compara CL y 5d ( porque 5 es el número máximo de dígitos


permitidos)
JG endwhile ; Si CL > 5 entonces salta a la función 'endwhile'.

MOV ah, 1h ; Leer valor de STDIN en ah


INT 21h ; Interrupción ( para DOS)

CMP al, 0Dh ; comparar el valor leído con 0Dh que es el código ASCII para la tecla
ENTER
JE endwhile ; Si AL = 0Dh, Significa que ha presionado ENTER entonces se salta la
función 'endwhile'

SUB al, 30h ; 30h se resta el valor ASCII de entrada para obtener el numero real.
(ya que 30h ASCII = número '0')
MOV dl, al ; Mueve el valor de la entrada a dl.
PUSH dx ; saca DX en la pila, para conseguir que leer para leer la próxima
entrada
INC cl ; Incrementa CL

JMP while ; Sala de nuevo a la función while.


Función endwhile:
- En esta función retorna el mensaje contenido en la variable errorChk.
- Esta función solo se activara en caso la entrada ingresada no cumple con el límite
de dígitos pedidos por nuestro programa.
- En la Primera línea de instrucción se decrementa nuestro contador porque en la
función anterior hicimos un incremento más.
- En las últimas instrucciones de guarda la dirección del valor de ‘errorChk’ en BX y al
final nuestro contador se hace en 0 nuevamente.
- Para comenzar nuevamente a procesar la entrada del usuario.

endwhile:
; Fin de la entrada del usuario
DEC cl ; decremento CL por uno para reducir el incremento hecho en la última
iteración

CMP cl, 02h ; comparar CL con 02, ya que solo 3 números pueden ser aceptados
como EN RANGO
JG overflow ; si CL (número de caracteres de entrada) es mayor que 3 Cambiar a la
label 'overflow'

MOV BX, OFFSET errorChk ; obtener la dirección de la variable 'errorChk' en BX.


MOV BYTE PTR [BX], cl ; establecer "errorChk 'al valor de CL

MOV cl, 0h ; CL fijado a 0, porque contador se utiliza en la siguiente sección de


nuevo

Función while2:
- Esta función Crea la representación numérica real del número ingresado por el
usuario como tres caracteres.
- Esta representación se envía a la función while3 que hará la conversión de estos
caracteres a decimal.
- Para después poder hacer la comparaciones con nuestra variable ‘number’ y poder
saber si el usuario ha ingresado el numero o correcto o aun no.

; Comenzar a procesar la entrada del usuario


; Crea la representación numérica real del número ingresado por el usuario como tres
caracteres.
while2:
CMP cl,errorChk
JG endwhile2

POP dx ; POP DX valor almacenado en la pila, (del digito menos significativo m


para el digito más significativo)

MOV ch, 0h ; limpia CH y se utiliza en este bucle interior como contador


MOV al, 1d ; inicializa AL en 1 (decimal)
MOV dh, 10d ; establece a DH el 10 (decimal)
Función While3:
- Esta función se encarga de convertir los caracteres ingresados por el usuario y
convertirlos.
- Esta conversión se realizara por ciclos, dependiendo de nuestra variable CL (nuestro
contador).
- Para esto usaremos otro contador que será CH. Para recorre CL.
- Saldremos de while3 cuando CH iguale a CL.

; COMIENZO bucle; - SI CL es 2
; - Primera bucle producirá 10 ^ 0
; - Segundo bucle producirá 10 ^ 1
; - Tercera bucle producirá 10 ^ 2

while3:

CMP ch, cl ; Compara CH y CL


JGE endwhile3 ; si CH >= CL, salta a 'endwhile3

MUL dh ; AX = AL * DH donde DH es = to (AL * 10)

INC ch ; incremento CH
JMP while3 ; Salto a 'while3'

Función Endwhile3:
; Fin del cálculo de la potencia
; AL ahora contiene 10 ^ 0, 1 o 10 ^ 10 ^ 2 en función del valor de CL

MUL dl ; AX = AL * DL, que es el valor real de posición de número

JO overflow ; Si hay un salto de desbordamiento en 'overflow' label (para valores


por encima de 300)

MOV dl, al ; mover el resultado de la multiplicación a DL


ADD dl, guess ; añadir resultado (valor posicional real del numero) al valor de
'adivinar' la variable

JC overflow ; Si hay un salto de desbordamiento en label 'overflow' (para valores


por encima de 255 a 300)

MOV BX, OFFSET guess ; obtener la dirección de la variable 'guess' en BX.


MOV BYTE PTR [BX], dl ; Establecer el valor de 'errorChk' a DL

INC cl ; Incrementa CL contador

JMP while2 ; Salta hacia atrás a 'while2'


Función Endwhile2:
- Esta función se encarga de comparar nuestro entrada del usuario ya convertida a
decimal
- Si guess (Valor ingresado por el usuario) es igual a number(valor buscado) entonces
se hace un salto a la función ‘equal’.
- Si guess (Valor ingresado por el usuario) es mayor number(valor buscado) entonces
se hace un salto a la función ‘greater’.
- Si guess (Valor ingresado por el usuario) es menor a number(valor buscado)
entonces se hace un salto a la función ‘lower’.

endwhile2:
; Fin del proceso de La entrada del usuario.

MOV ax, @data ; obtener la dirección de los datos a AX


MOV ds, ax ; obtener 'data segment' al valor de AX que es 'address of data'.

MOV dl, number ; Carga 'number' a DL


MOV dh, guess ; Carga 'guess' a DH

CMP dh, dl ; Compara DH y DL (DH - DL)

JC greater ; si DH (GUESS) > DL (NUMBER) salta a la función greater


JE equal ; si DH (GUESS) = DL (NUMBER) salta a la función equal
JG lower ; si DH (GUESS) < DL (NUMBER) salta a la función lower

Función Equal:
- Esta función imprime el mensaje almacenado en la variable ‘equalMsg’.
- Posteriormente sala a la función ‘exit.’
-

equal:
;Carga el contenido de la variable equalMsg

MOV dx, offset equalMsg ; Carga la dirección del mensaje de 'equalMsg' a DX


MOV ah, 9h ; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h ; (Interrupción DOS)
JMP exit ; Salta a 'exit'
Función Greater:
- Esta función imprime el mensaje almacenado en la variable ‘moreMsg’.
- Posteriormente salta al inicio del programa para que el usuario pueda ingresar otro
número. ‘start’

greater:

MOV dx, offset moreMsg ; Carga la dirección del mensaje de 'moreMsg' a DX


MOV ah, 9h ; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h ; (Interrupción DOS)
JMP start ; Salta al inicio del programa(start)

Función Lower:
- Esta función imprime el mensaje almacenado en la variable ‘lessMsg’.
- Posteriormente salta al inicio del programa para que el usuario pueda ingresar otro
número. ‘start’

lower:

MOV dx, offset lessMsg ; Carga la dirección del mensaje de 'lessMsg' a DX


MOV ah, 9h ; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h ; (Interrupción DOS)
JMP start ; Salta al inicio del programa(start)

Función Overflow:
- Esta función imprime el mensaje almacenado en la variable ‘overflowMsg’.
- Posteriormente salta al inicio del programa para que el usuario pueda ingresar otro
número. ‘start’

overflow:

MOV dx, offset overflowMsg ; Carga la dirección del mensaje de 'overflowMsg' a DX


MOV ah, 9h ; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h ; (Interrupción DOS)
JMP start ; Salta al inicio del programa(start)
Funciónes Exit y retry_while:
Retry_while:

- En esta función se muestra un mensaje preguntando al usuario si desea seguir


ejecutando el programa.
- Donde el usuario solo puede responder con ‘y’ y ‘n’. Si el ingresa otro carácter
nuestro programa volverá a preguntar si desea continuar.
- Si el usuario ingresa ’n’ se salta a la función ‘return_to_DOS’. Caso contrario ingrese
‘y’ se salta a la función ‘restart’.

exit:

; Preguntar al usuario si necesita volver a intentarlo


retry_while:

MOV dx, offset retry ; Carga la dirección del mensaje de 'prompt' a DX

MOV ah, 9h ; Escribe una cadena de STDOUT (para DOS interrupt)


INT 21h ; (Interrupción DOS)

MOV ah, 1h ; lee un carácter de STDIN en AL (para DOS interrupt)


INT 21h ; (Interrupción DOS)

CMP al, 6Eh ; Compara si la entrada es 'n'


JE return_to_DOS ; llama a 'return_to_DOS' si la entrada es 'n'

CMP al, 79h ; revisa si la entrada es'y'


JE restart ; llamar a 'restart' si la entrada es 'y'
; salta a "restart"

JMP retry_while ; Si la entrada no es 'y' ni 'n', se vuelve a preguntar

Funciónes retry_endwhile , restart y return_to_DOS:


restat:
- Esta función nos envía al inicio del programa.
Return_to_DOS:
- Esta función finaliza nuestro programa.

retry_endwhile:

restart:
JMP start ; Salta al inicio del programa(start)
return_to_DOS:
MOV ax, 4c00h ; Retorna ms-dos
INT 21h ; (Interrupcion DOS)
end start ;finaliza start
RET

También podría gustarte