Está en la página 1de 10

LENGUAJE ENSAMBLADOR

Reporte de Investigacin
Ciclo loop Lectura de caracteres Interrupciones

Practica
Serie Fibonacci Repeticin de cadena Lectura de carcter ASCII

Profesor Dr Carlos Torres Reyes

abril 2013

Ciclo Loop (Tengo que hacer mi tarea)


LA creacin de un programa no importando en el lenguaje en que ser creado , es necesario utilizar ciertos controles que mantengan un orden en la ejecucin de cierto cdigo , ya que estos controles nos ayudan a maximizar el tiempo de ejecucin y ayuda al programador a crear menos cdigo. Uno de estos controles en de repeticin loop por ahora y uno de los que se encuentra en el lenguaje ensamblador es Loop. Crear un programa que imprima 10 veces Tengo que hacer mi tarea es la problemtica que se est manejando. Si observamos a simple vista esto es fcil de hacer si sabemos imprimir una cadena pero tendramos que repetir ese mismo bloque que hace que imprima una cadena 10 veces lo cual es demasiado, no en este templo pero si necesitramos que se generara la impresin de 10000 veces la misma cadena la cantidad de cdigo seria enorme y a pesar de que sera lo mismo 10000 podemos cometer algn error entre todo eso y sera algo laborioso de resolver. Usando el control de repeticin nos daremos cuenta de que se necesita un solo bloque que imprima la cadena y unas cuantas lneas que tendra el nmero de repeticiones que se generaran. Como trabaja Loop Loop est relacionado con cx ya que en este se carga las con las veces de repeticiones que tendr el cdigo. De nada servira cx ci este es esttico asi que cada repeticin cx se encarga de decremento en 1. Cuando cx tiene un valor de cero automticamente el ciclo se acaba y procede a continuar el cdigo despus de loop.

abril 2013

Diagrama de Flujo
Inicio

Cx=10 Texto1=Mensaje Texto2=Mensaje Fin

Cx<=10 Cx=Cx-1

no
Texto2

si

Texto1

Fin

abril 2013

Cdigo

Los resultados al crear este pequeo programa fue la repeticin de la cadena saludo 10 veces .Se presentaron unos problemas al no saber cmo funcionaba .starup pero esta se solucion al viendo como era que se comportaba y se obtuvo que hace que se genere la salidas en la consola en la primera lnea. Para que el programa no se cerrara al momento en que se terminaba de repetir la cadena del mensaje se utiliz int 16h 0 para que obtuviera una pulsacin del teclado y as hacerlo mas dinmico.

abril 2013

Lectura de carcter ASCII


En un programa hay distintas formas de tener datos una seria dando por defecto que datos tendr cierta variable y otra introducindolo. El usuario tiene que introducir un dato con el mouse teclado etc. En este caso tendremos en cuenta solo el teclado. Para poder hacer una lectura del teclado necesitamos usar la interrupcin 21h, 01h. Como funciona 21h, 01h AH = 01H DEVUELVE: AL = Cdigo ASCII del Carcter ledo y Echo a pantalla (Si AH =08H) es servicio sin Echo) EFECTO: Se lee un carcter del dispositivo de entrada estndar, y se enva al dispositivo estndar de salida. Si al llamar a la funcin no haba ningn carcter disponible, se esperar a que lo haya. Normalmente el dispositivo estndar de entrada es el teclado, y el dispositivo estndar de salida es la pantalla. Adems de saber introducir un dato no basta ya que necesitamos mandar este dato de vuelta para poder imprimirlo en la pantalla. Para esto usamos la interrupcin 21h, 02h. Como funciona 21h, 02h AH = 02H DL = Cdigo ASCII a enviar al dispositivo de salida. DEVUELVE: NADA. EFECTO: Se enva el carcter depositado en el registro DL al dispositivo estndar de salida.

Uno de los grandes problemas que se presentaron fue el caso de Lea que no se tena conocimiento de cmo funcionaba pero al investigar y ver como se comportaba. Como funciona Lea LEA destino, fuente El operando fuente debe estar ubicado en memoria, y se coloca su desplazamiento en el registro ndice o apuntador especificado en destino.
5 abril 2013

Para ilustrar una de las facilidades que tenemos con este comando pongamos una equivalencia: MOV SI, OFFSET VAR1 Equivale a: LEA SI, VAR1 El funcionamiento del programa consiste en introducir un carcter para poder trabajar con su equivalencia en hexadecimal. Pero debemos generar un nmero parecido al carcter pero no igual ya que el 1 hexadecimal no representa el 1 como carcter. Para lograr esto solo se le restaba 30 ya que es la diferencia que hay entre el carcter y el hexadecimal o 48 para el carcter y el decimal. Al restar e imprimir nos genera el carcter equivalente al valor del carcter que elegimos.

Diagrama de Flujo

Inicio

Leer: var1

Var1=var1 Var2=var1-30 misN=tu numero en hexadecimal hexa =h Cero =0 vHe=el valor de Ess=en ASCII es el caracter Fin=Preciona una tecla para Terminar Conv=Para convertirlo al caracter ASCII Suma=Se le suma 30

abril 2013

Misn+var1

Vhe+cero+var1hexa+ess+var2

Conv+var1+suma

fin

fin

Codigo
TITLE De Asciia Hexadecimal .model small .stack .data msg db 'Dame un numero (0 a 9) $' misN db cr,lf,'Tu numero en Hexadecimal $' hexa db 'h$' cero db '0$' vHe db cr,lf,'El valor de $' 7 abril 2013

Ess db ' en ASCII es el caracter $' fin db cr,lf,'Preciona una tecla para Terminar$' conv db cr,lf,'Para convertirlo al caracter ASCII $' suma db ' Se le suma 30 ',cr,lf, "$" cr equ 13 lf equ 10 var1 db ? var2 db ? .code .startup

mov ah,09h ;interrupcion para imprimir lea dx,msg ;obtener la direccion de memoria de msg int 21h ;ejecuta la interrupcion (DOS)

mov ah,01h ;leer caracter desde el teclado int 21h ;lee primer caracter (DOS) mov var1,al ;lo guardo en variable var1 sub al,30h ;resto 30H (48Dec) para obtener el numero (CERO) mov var2,al

mov ah,09h lea dx,misN ;poner Tu numero en Hexadecimal int 21h

mov ah,09h lea dx,cero ;poner 0 int 21h

mov dl,var1 ;pongo en dl el numero a imprimir ;add dl,30h ;agrego 30 (48Dec) para obtener el caracter 8 abril 2013

mov ah,02h ;funcion para imprimir un caracter en pantalla int 21h ;llamado a DOS

mov ah,09h lea dx,hexa ;imprime h int 21h

mov ah,09h lea dx,vHe ;poner El valor de int 21h

mov ah,09h lea dx,cero ;poner 0 int 21h

mov dl,var1 ;add dl,30h ;imprimir valor1 mov ah,02h int 21h

mov ah,09h lea dx,hexa ;imprime h int 21h mov ah,09h lea dx,ess int 21h

mov dl,var2 ;add dl,30h ;imprimimos el valor ascii del numero mov ah,02h 9 abril 2013

int 21h

mov ah,09h lea dx,conv int 21h mov dl,var2 add dl,30h ;imprimimos el valor ascii del numero mov ah,02h int 21h mov ah,09h lea dx,suma int 21h mov ah,09h lea dx,fin int 21h mov ah,0h ;esperamos que se pulse una tecla para finalizar int 16h .exit end

Al terminar el programa se observ que el funcionamiento tanto de la maquina un cdigo simblico y uno de interpretacin soy totalmente diferentes y se requiere de conversiones para poder saber qu es lo que estamos representando. El nico error que se obtuvo el de no saber cmo leer el verdadero valor de un carcter ascii ya que podamos modificar su valor sumando o restando y obtener un carcter totalmente diferente al principal pero siempre nos regresaba un carcter y no el valor que en realidad vale en hexadecimal .

10

abril 2013