Anda di halaman 1dari 10

UNIVERSIDAD NACIONAL DE SAN AGUSTIN

FACULTAD INGENIERA DE PRODUCCIN


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
Introduccin:
Este programa consiste en adivinar un nmero almacenado en nuestro programa, para esto el
usuario tendr que ingresar el nmero que l cree que sea correcto. Y Nuestro programa le
brindara respuestas como; El nmero buscado es mayor o menor; de esta manera pueda llegar
al nmero correcto.
Recibir otro mensaje si acierta con el numero buscando. Automticamente Se le preguntara al
Usuario si desea continuar jugando (y/n).
Si se Escoge la opcin el programa se seguir ejecutando caso contrario el programa culminara.

Cdigo fuente y breve explicacin del Programa:


En nuestras tres primeras lneas de cdigo: son instrucciones del modelo de memoria, segmento
de banderas, segmentos de datos y segmentos de Cdigo respectivamente.
.model small ; Modelo de Memoria.
.stack 100h ; Segmentos de banderas.
.data
; Segmentos de datos.
//Declaracin de variables

.code
; Segmentos de cdigo.

Las siguientes instrucciones corresponden a la declaracin de todas las variables utilizadas en


nuestro programa.
I.
II.

III.

Constantes:
- CR y LF
Variables:
- number: esta variable ser el nmero 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.
Mensajes:
- Prompt, LessMsg, MoreMsg, equalMsg, OverflowMsg y retry.

number db 51d ;variable 'number' Se almacena el valor aleatorio


;Declaracin 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
errorChk db 0d

param

;Variable guardara el valor introducido por el usuario


;Variable se utilizara para comparar si el numero introducido esta
Fuera de rango.

label Byte

Funcin start:
-

Las primeras 4 lneas de cdigo a los registros ax, bx, cx y dx,se les da el valor de 0.
Las siguientes lneas de cdigo 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 direccin 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 direccin 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 direccin del segmento de datos
MOV ds, ax
; mueve la direccin al registro de segmento por medio de AX
MOV dx, offset prompt ; Carga prompt en DX
MOV ah, 9h
INT 21h

; Escribe cadena a STDOUT en ah


; Interrupcin ( para DOS)

MOV cl, 0h
MOV dx, 0h

; Carga en CL 0 (Contador)
; Carga en DX 0 (Datos registro utilizado para almacenar la entrada
del usuario)

; END START

Funcin while:
-

Esta funcin se encarga de leer la entrada del usuario donde primero se valida que
no superen los 5 dgitos para comparar usa el registro CL (que sera nuestro
contador).
Despus se procede a preguntar si la ltima tecla que el usuario presiono sea
ENTER, si es as se salta a la funcin endwhile. Caso contrario pasara a la siguiente
instruccin.
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 funcin.
Para salir de esta funcin el usuario tendra que presionar la tecla ENTER.

; -- leyendo la entrada del usuario


while:
CMP
JG

cl, 5d
endwhile

;Compara CL y 5d ( porque 5 es el nmero mximo de dgitos


permitidos)
; Si CL > 5 entonces salta a la funcin 'endwhile'.

MOV ah, 1h
INT 21h

; Leer valor de STDIN en ah


; Interrupcin ( para DOS)

CMP

; comparar el valor ledo con 0Dh que es el cdigo ASCII para la tecla
ENTER
; Si AL = 0Dh, Significa que ha presionado ENTER entonces se salta la
funcin 'endwhile'

JE

SUB

al, 0Dh
endwhile

al, 30h

MOV dl, al
PUSH dx
INC

cl

JMP while

; 30h se resta el valor ASCII de entrada para obtener el numero real.


(ya que 30h ASCII = nmero '0')
; Mueve el valor de la entrada a dl.
; saca DX en la pila, para conseguir que leer para leer la prxima
entrada
; Incrementa CL
; Sala de nuevo a la funcin while.

Funcin endwhile:
-

En esta funcin retorna el mensaje contenido en la variable errorChk.


Esta funcin solo se activara en caso la entrada ingresada no cumple con el lmite
de dgitos pedidos por nuestro programa.
En la Primera lnea de instruccin se decrementa nuestro contador porque en la
funcin anterior hicimos un incremento ms.
En las ltimas instrucciones de guarda la direccin 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
iteracin
CMP cl, 02h
JG overflow

; comparar CL con 02, ya que solo 3 nmeros pueden ser aceptados


como EN RANGO
; si CL (nmero de caracteres de entrada) es mayor que 3 Cambiar a la
label 'overflow'

MOV BX, OFFSET errorChk ; obtener la direccin 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 seccin de


nuevo

Funcin while2:
-

Esta funcin Crea la representacin numrica real del nmero ingresado por el
usuario como tres caracteres.
Esta representacin se enva a la funcin while3 que har la conversin de estos
caracteres a decimal.
Para despus 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 representacin numrica real del nmero ingresado por el usuario como tres
caracteres.
while2:
CMP cl,errorChk
JG endwhile2
POP dx

MOV ch, 0h
MOV al, 1d
MOV dh, 10d

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


para el digito ms significativo)
; limpia CH y se utiliza en este bucle interior como contador
; inicializa AL en 1 (decimal)
; establece a DH el 10 (decimal)

Funcin While3:
-

Esta funcin se encarga de convertir los caracteres ingresados por el usuario y


convertirlos.
Esta conversin 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
JGE endwhile3

; Compara CH y CL
; si CH >= CL, salta a 'endwhile3

MUL dh

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

INC ch
JMP while3

; incremento CH
; Salto a 'while3'

Funcin Endwhile3:
; Fin del clculo de la potencia
; AL ahora contiene 10 ^ 0, 1 o 10 ^ 10 ^ 2 en funcin del valor de CL
MUL dl
JO overflow

; AX = AL * DL, que es el valor real de posicin de nmero


; Si hay un salto de desbordamiento en 'overflow' label (para valores
por encima de 300)

MOV dl, al
ADD dl, guess

; mover el resultado de la multiplicacin a DL


; aadir 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 direccin de la variable 'guess' en BX.


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

; Incrementa CL contador
; Salta hacia atrs a 'while2'

Funcin Endwhile2:
-

Esta funcin 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 funcin equal.
Si guess (Valor ingresado por el usuario) es mayor number(valor buscado) entonces
se hace un salto a la funcin greater.
Si guess (Valor ingresado por el usuario) es menor a number(valor buscado)
entonces se hace un salto a la funcin lower.

endwhile2:
; Fin del proceso de La entrada del usuario.
MOV ax, @data
MOV ds, ax
MOV dl, number
MOV dh, guess
CMP dh, dl
JC greater
JE equal
JG lower

; obtener la direccin de los datos a AX


; obtener 'data segment' al valor de AX que es 'address of data'.
; Carga 'number' a DL
; Carga 'guess' a DH
; Compara DH y DL (DH - DL)
; si DH (GUESS) > DL (NUMBER) salta a la funcin greater
; si DH (GUESS) = DL (NUMBER) salta a la funcin equal
; si DH (GUESS) < DL (NUMBER) salta a la funcin lower

Funcin Equal:
-

Esta funcin imprime el mensaje almacenado en la variable equalMsg.


Posteriormente sala a la funcin exit.

equal:
;Carga el contenido de la variable equalMsg
MOV dx, offset equalMsg ; Carga la direccin del mensaje de 'equalMsg' a DX
MOV ah, 9h
; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h
; (Interrupcin DOS)
JMP exit
; Salta a 'exit'

Funcin Greater:
-

Esta funcin imprime el mensaje almacenado en la variable moreMsg.


Posteriormente salta al inicio del programa para que el usuario pueda ingresar otro
nmero. start

greater:
MOV dx, offset moreMsg ; Carga la direccin del mensaje de 'moreMsg' a DX
MOV ah, 9h
; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h
; (Interrupcin DOS)
JMP start
; Salta al inicio del programa(start)

Funcin Lower:
-

Esta funcin imprime el mensaje almacenado en la variable lessMsg.


Posteriormente salta al inicio del programa para que el usuario pueda ingresar otro
nmero. start

lower:
MOV dx, offset lessMsg ; Carga la direccin del mensaje de 'lessMsg' a DX
MOV ah, 9h
; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h
; (Interrupcin DOS)
JMP start
; Salta al inicio del programa(start)

Funcin Overflow:
-

Esta funcin imprime el mensaje almacenado en la variable overflowMsg.


Posteriormente salta al inicio del programa para que el usuario pueda ingresar otro
nmero. start

overflow:
MOV dx, offset overflowMsg ; Carga la direccin del mensaje de 'overflowMsg' a DX
MOV ah, 9h
; Escribe una cadena de STDOUT (para DOS interrupt)
INT 21h
; (Interrupcin DOS)
JMP start
; Salta al inicio del programa(start)

Funcines Exit y retry_while:


Retry_while:
-

En esta funcin 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 carcter
nuestro programa volver a preguntar si desea continuar.
Si el usuario ingresa n se salta a la funcin return_to_DOS. Caso contrario ingrese
y se salta a la funcin restart.

exit:
; Preguntar al usuario si necesita volver a intentarlo
retry_while:
MOV dx, offset retry ; Carga la direccin del mensaje de 'prompt' a DX
MOV ah, 9h
INT 21h

; Escribe una cadena de STDOUT (para DOS interrupt)


; (Interrupcin DOS)

MOV ah, 1h
INT 21h

; lee un carcter de STDIN en AL (para DOS interrupt)


; (Interrupcin 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
JE restart

; revisa si la entrada es'y'


; 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

Funcines retry_endwhile , restart y return_to_DOS:


restat:
-

Esta funcin nos enva al inicio del programa.

Return_to_DOS:
-

Esta funcin 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

Anda mungkin juga menyukai