cómo terminar un código ensamblador

Estoy tratando de escribir un código para pic16f877 traduciendo un algoritmo simple en código ensamblador.

El conjunto de instrucciones no tiene tal instrucción.

ingrese la descripción de la imagen aquí

Esto es lo que escribí:

MOVF 0X40,W
MOVWF 0X50
SUBWF 0X41,W
BTFSS Status,C
GOTO label
MOVF 0X41 ,W
MOVWF 0X50
label END

Mi pregunta es: ¿hay alguna manera de "finalizar" un algoritmo al programar un microcontrolador usando código ensamblador?

Hay muy poca información. ¿Qué espera que haga el µC al final del código? ¿Bucle infinito?
¿Estás escribiendo una función? Si es así, ¿regresar al lugar de donde viniste?
Agregué más información, espero que esté claro ahora
@ A.Bukhari Todavía no está muy claro. ¿Cuánta experiencia tienes en programación de microcontroladores? Por lo general, si solo tiene una función, no la finaliza, la ejecuta en un bucle. Explique en detalle qué es lo que está tratando de hacer, cómo se llamará lo que desea ejecutar, qué espera que suceda, etc.
Agregué un PS @AndrejaKo
¿Qué tal GOTO END?
Creo que deberíamos poner una etiqueta después de GOTO
Parece que ya tienes una etiqueta llamadaEND
mi etiqueta es "etiqueta"!!
END es una directiva de ensamblador, no una instrucción. La palabra está reservada. No se puede utilizar como parte de una línea de programa.
Apague el perro guardián y otras fuentes de interrupción, luego use la SLEEPinstrucción (consulte la sección 14 de la hoja de datos). Sería diferente en un microcontrolador diferente, pero eso detendrá el que está usando.

Respuestas (3)

Deténgase y realmente piense en ello.

¿Qué quiere que haga el microcontrolador después de que esté hecho con la poca lógica que muestra? Seguro que hay algo . ¿Debería volver a realizar la operación? ¿Debería volver a alguna tarea más grande? ¿Debería esperar a que suceda algo externo y luego volver a hacerlo? Incluso si se supone que no debe hacer "nada" hasta que se desconecte la energía, en realidad es algo que tiene que decirle que haga.

El punto es que no hay un "final". No tiene sentido. Todo requiere alguna acción. Incluso apagarse a sí mismo a través de algún interruptor externo requiere activar ese interruptor.

En un tema aparte, los diagramas de flujo realmente deberían indicar la lógica del siguiente nivel, no los detalles de cómo el procesador realizará esa lógica. Está especificando detalles sobre cosas como el registro W en su diagrama de flujo. En cambio, debería mostrar algo así como un bloque de comparación entre A y B (o lo que sea), luego dos o más opciones para tomar dependiendo del resultado. Cuando codifica esto en ensamblaje, descubre las instrucciones reales para realizar la lógica de nivel superior descrita por el diagrama de flujo.

También es malo referirse a las variables por sus direcciones. Refiérase a la variable simbólicamente, luego deje que el enlazador decida dónde pegarlos en la memoria. Eso realmente no es de su incumbencia, aparte quizás del banco en el que deberían estar. Su diagrama de flujo se refiere a tres variables diferentes a las 40h, 41h y 50h. Déles nombres y use los nombres en el diagrama de flujo. Los buenos nombres también ayudan a iluminar la lógica. Incluso cuando codifica esto en ensamblador, todavía da nombres a las variables y se refiere a ellas por nombres en el código.

Solo para que quede claro: en el código de ensamblaje de microcontroladores generalmente no hay un final. Ciertamente no hay una instrucción final. No hay un sistema operativo al que devolver el control, y no hay forma de "detenerse".

El código del microcontrolador casi siempre contiene un bucle infinito.

Cuando trabajas con un µC, tienes que hacer un bucle infinito al final de tu código. De lo contrario, no controlará lo que hará el µC. Si olvida dicho bucle, el µC lo activará y bloqueará la ejecución del programa. (llamado ISR_TRAP en MSP430 de TI)

En C, básicamente terminará su código con algo como while(1)o for(;;). Al hacerlo, el procesador realizará alguna tarea inactiva para que permanezca activo y consciente de la interrupción.

Lo mismo para el ensamblaje, debe hacer que su código se repita para que permanezca activo.

loop:
     jmp loop