sábado, 13 de diciembre de 2008

SC. For con predecremento

En este apartado nos vamos a ocupar de realizar un bucle de repetición con predecremento. Declararemos un índice o contador que se encargará de fijar el número de repeticiones, al ser dicha variable de 8-bits, su tamaño máximo, por lo tanto, las repeticiones máximas que serán posibles será de 255 veces.

La sintaxis en un lenguaje de medio-alto nivel es la siguiente:

for(Contador=numero; Contador==0; --Contador)
{
sentencia; // Bloque de Código
}


La forma de actuar esta sentencia de control es la siguiente: Repetir la sentencia hasta que la variable contador sea cero.

Hay que tener en cuenta, que en este caso, el bucle es predecremento, esto quiere decir que antes de analizarse la variable contador, se decrementará en una unidad.

La traducción a código ensamblador sería tal como sigue:

       ·····    ········

movlw numero ; Número de repeticiones: numero
movwf Contador ; Se carga a Contador

FOR

decfsz Contador,f ; ¿--Contador == 0?
goto Bucle_For ; Ejecuta el bloque de sentencia
goto Salir ; NO -> Sal del FOR

Bucle_For

       ·····    ········          ;  Aquí el código a repetir
goto FOR ; Vuelve al FOR

Salir
····· ········
; Fin de repeticiones
Como se puede observar, primero se carga el registro de trabajo W con un literal, dicho literal debe ser el número de repeticiones, menos una, que deseamos repetir una parte de código. Posteriormente, se carga a la variable Contador, que será la encargada de gestionar las repeticiones.

Una vez cargada la variable Contador, se repetirá el código deseado en número de veces que hemos prefijado. El control de este bucle recae, como ya se ha comentado, en la variable Contador, donde se decrementará en una unidad y finalmente se analizará si su valor es cero. En caso afirmativo, se saldrá del bucle y en caso contrario, se volverá a procesar una vez más, el bloque de código deseado.

En todo bucle, y más si es de repetición, es necesario y de vital importancia saber cuantos ciclos de máquina consume. Para este caso:

+1 +1 +(numero - 1)·(+1 +2 +2 +Bloque_Código) +2 +2 = +6 +(numero - 1)·(+5 +Bloque_Código)

Donde en numero es el número de repeticiones (menos una, ya que este bucle es predecremento) y Bloque_Código corresponde a los ciclos de máquina correspondiente a la porción de código que se va a repetir.

Como se puede apreciar, son sentencias bastantes simples y óptimas por su rapidez de ejecución, donde los ciclos de máquina varía dependiendo del código a repetir y del número de veces.

0 comentarios: