Programa en Emu8086

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

description

Descripción de un programa realizado en lenguaje ensamblador.

Transcript of Programa en Emu8086

Page 1: Programa en Emu8086

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

Page 2: Programa en Emu8086

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.

Page 3: Programa en Emu8086

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

Page 4: Programa en Emu8086

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.

Page 5: Programa en Emu8086

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)

Page 6: Programa en Emu8086

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'

Page 7: Programa en Emu8086

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'

Page 8: Programa en Emu8086

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)

Page 9: Programa en Emu8086

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

Page 10: Programa en Emu8086