Ejemplo de bucle for en windlx

Les voy a mostrar como pasar de pseudocódigo a código ensamblador para el simulador académico windlx el siguiente bucle for. Este simulador lo usan en Ingeniería de computadores 2 en la UNED para las prácticas las cuales son complejas ya que en ningún momento explican este tipo de código o como usar el windlx. Básicamente simula lo que hace un compilador de c o cualquier lenguaje compilado, traducir el código del programador a repertorio de instrucciones. El simulador windlx emula un procesador concreto, ficticio, cuyo objetivo es dar una aproximación a estudiantes de ingeniería en sistemas a lo que hace un procesador con su repertorio de instrucciones, como maneja los saltos, las dependencias de datos, las direcciones de memoria, etc. No es un procesador real ya que cada modelo de procesador tiene su propio repertorio de instrucciones.

ejecución de windlx

ejecución de windlx

Se trata de implementar el código del siguiente bucle en windlx

for(i=0;i<40;i++)
{

 if (A[i] == b)
 {
    A[i] = A[i] + a
 }
 else
 {
    A[i] = A[i] - a

 }

}

El código en windlx

.data
.align 2
 
A: .float 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
 .float 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
 .float 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0
 .float 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0
a: .float 2.0
b: .float 1.0
.text
.global main
main:



 add r1,r0,A
 addi r2,r1,#156
 ld f4, a
 ld f6, b
 
inicio:
 ld f8, 0(r1)
 eqd f8, f6 ;if(A[i] == b) ir a then
 BFPF then
else:
 addf f8,f8,f4 ; A[i] = A[i] + a
 j final
then:
 subf f8,f8,f4; A[i] = A[i] - a
final:
 sd 0(r1), f8
 addi r1,r1,#4
 sgt r6, r1,r2
 beqz r6, inicio

trap 0

Lo primero que hacemos es iniciar el vector A de 40 elementos con valores a mano. La instrucción a: .float 2.0 inicia la variable a con ese valor. Lo mismo ocurre con la variable b.

Las directivas .text y .global main hay que usarlas ( consulten la documentación del windlx) y luego viene lo importante.

Hay que recordar que este lenguaje se basa en el uso de etiquetas para ir saltando entre ellas.

Etiqueta main.

add r1,r0,A lo que hacemos es la dirección de comienzo de A le sumamos 0, que es lo que contiene r0 y lo guardamos en r1.

Addi r2,r1,#156: suma la dirección de comienzo de A, le suma 156, que como son 40 elementos * 4 bytes = 156 bytes.

ld f4, a y ld f6, b copian sus respectivos contenidos a los registros f4 y f6.

Etiqueta inicio

En esta etiqueta es donde comienza el cuerpo del bucle. Aquí en cada iteración va a ir cargando el contenido del puntero en el registro f8 con las instrucción ld f8, 0(r1), recordemos que r1 contiene la posición de memoria del primer elemento del vector

La segunda instrucción de esta etiqueta eqd f8, f6 compara si (A[i] == b) que si es cierto guarda  un 1 en un registro especial llamado pfrs. La tercera instrucción bfpf then pregunta si fprs == 0 que salta a la etiqueta then

Etiqueta else

La instrucción addf f8,f8,f4 lo que hace es sumar al valor actual del vector A[i] = A[i] + a y lo guarda en f8, que es el registro que tiene el valor de A[i].

La segunda instrucción es j final y significa que salte a final, para que no ejecute lo que hay en la etiqueta then

Etiqueta then

La instrucción subf f8,f8,f4  lo que hace es  A[i] = A[i] – a, mejor dicho al registro f8 que contiene el valor que hay en A[i] le resta a y lo guarda en f8.

Etiqueta final

La primer instrucción guarda lo que tiene el registro f8, que es el contiene el valor de A[i] , en la posición de memoria que tiene guardado r1, que es el puntero al elemento actual del array.

Suena confuso pero en vez de ser como la programación tradicional que ya operamos sobre A[i] , aquí operamos sobre un registro que tiene el contenido de A[i], por eso hay que guardar f8 en la posición real de memoria.

La segunda instrucción incrementa en 4 bytes r1, para que apunte al segundo elemento del vector. Como cada elemento del vector ocupa 4 bytes al ser floats y todo el vector está en posiciones de memoria consecutivas, el puntero va incrementado sus direcciones de memoria en 4 bytes de modo que cada vez que sumamos 4 bytes pasa a apuntar al siguiente elemento, es similar a incrementar 1 al indice i en programación

La tercera instrucción compara r1 y r2. Este ultimo contiene la posición final del vector y si r1 > r2 quiere decir que ha llegado al final del mismo. Cuando esto ocurre guarda en r6 un 1. Este r6 es lo que pregunta la ultima instrucción, beqz r6, inicio,  si es igual a 0 que vaya a inicio, es decir que es un nuevo ciclo y si es un 1 pues va a trap 0 que es cuando el programa termina.

Los archivos que usa el windlx son con extensión .s por lo que puedes editarlo en cualquier editor de texto tipo notepad++ y guardarlo con dicha extensión.

Anuncios

3 pensamientos en “Ejemplo de bucle for en windlx

    • No se que te puede pasar, que editor de texto estás usando? Lo digo por los finales de linea, espacios al principio y tal. Usa el notepad ++ y presta atención a que no tenga espacios al principio de las intrucciones:
      add r1,r0,A
      addi r2,r1,#156
      ld f4, a
      ld f6, b
      Te lo digo porque he copiado y pegado el codigo y me ha dado error porque tenia espacios ahi. Los he quitado y ha corrido correctamente el programa. REcuerda que debe tener extensión .s

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s