Primero una cosa importante, para volver de una subrutina no uses retfie, puede que funcione pero no está pensado para eso. retfie se utiliza para retornar de rutinas de interrupción y para habilitar las interrupciones globales (ambas cosas a la vez).
Para retornar de una subrutina utiliza return (solamente hace el retorno) o retlw (retlw además copia un valor literal al registro W).
En tu penúltimo mensaje habías puesto "movlw hola2; nose si esto sea correcto"; y tu duda es justificada, movlw está pensado no para mover información entre registros, sino para cargar una constante en el registro W. Uno puede poner movlw 25 o movlw 0x1F; es decir, el parámetro de movlw es siempre un valor numérico (un literal) de 8bits, pero no un registro.
Y ahora vamos al programa. El primer lazo definitivamente es un for, porque se va a repetir un número fijo de veces, independientemente de lo que pase en el resto del universo (o casi, si le tiran una bomba al pic seguramente dejará de ejecutarse el for
). Se ejecutaría hola2 + W (siendo el valor de W el que tenía antes de ejecutar la instrucción addwf hola2,0 ) veces.
En la segunda parte yo diría que es más bien un if doble, porque se ejecuta una sola vez. Sería como:
Código:
if RB0=1 then
sumador
else
nada
finIf
if RB7 = 1 then
restador
else
nada
finIf
goto primerTiempo
No sé adonde salta la última instrucción, si salta para arriba (volviendo a ejecutar algo que ya se ejecutó antes) sería un lazo infinito, que por cierto, siempre tiene que estar presente en un pic para que funcione (salvo el particular caso de que se maneje pura y exclusivamente con interrupciones).
En cuanto a hacer un while, no me preocuparía tanto por si es un while o un do-while o un for, mientras el programa haga lo que se quiere y sea entendible no me haría problema por eso.