Se supone que la directiva asm () que estás tratando de usar se usa para "incrustar" una única instrucción de ensamblador con el formato correcto, escrita como una cadena de caracteres de estilo C.
En otras palabras, algo como asm ("BCF 0,3");
El compilador mira esa cadena durante el tiempo de compilación e inserta esa instrucción exacta del ensamblador en su código, por eso le pide un carácter constante [], tiene que ser una cadena constante con el formato correcto cuando se compila el código.
Entonces, lo que intentas hacer al construir la cadena con sprintf durante la ejecución nunca podrá funcionar.
Además, si observa la descripción de las instrucciones del ensamblador GOTO para su PIC, verá que toma un valor fijo constante como la dirección para saltar.
La dirección forma parte de la instrucción en el momento de la compilación y no puede cambiarla sobre la marcha durante la ejecución.
Lo que estás tratando de hacer podría servir mejor utilizando los punteros de función. Consulte Diseño de codificación C: ¿punteros a funciones?
. Pero deberás tener cuidado al administrar & no destrozando la pila.