Me parece que te estas confundiendo y mucho. En todo.
MPLAB es un IDE, un Entorno de desarrollo que el compilador (MPASM) base que trae es el de Assembler o mas corto ASM. Este mismo IDE puede usarse con otro compilador que es el de XC8.
Es decir no necesitas MPLAB para programar, si quisiera por ejemplo hacer un .c en el bloc de notas y luego escribir en la linea de comandos para compilarlo lo podria hacer, solo necesito el compilador.
ASM tiene una relacion directa de lenguaje maquina (opcode) a cada instruccion.
Debido a que el "go to" puede crear problemas al saltar a otra linea de codigo
Tengo entendido que es mejor ensambler porque no solo realiza el salto reorganiza la pila como es debido
No se a que te referis con pila.
En ASM vos sos el encargado de manejar la pila de hardware para los CALL/RETURN, el GOTO no realiza ningun guardado automatico, TODO pero TODO lo tenes que hacer vos. Por lo que se necesita un buen conocimiento del microcontrolador.
Si lo que te referis como "pila" es el stack, entonces estas equivocado, a no ser que vos implementes un stack, lo cual no creo que lo realizes, no vas a tener uno.
El GOTO en C es malo en el sentido que si lo traducis a ASM, vas a notar que nunca estas sacando los datos de la pila de llamada. Y aqui viene el como se implementa una funcion.
Normalmente en ASM es asi:
Principal:
CALL Funcion1
GOTO Principal ; Esto es el while(1) en C, Loop infinito
Funcion1:
;Aca instruccion
RETURN
Cuando estamos en Principal es decir el equivalente a nuestro while(1) llama a Funcion1, esta instruccion copia la direccion de la proxima instruccion ( GOTO Principal ) y lo guarda en la pila de llamadas, Luego carga el valor de Funcion1 ( su direccion ) en el Contador de Programa (lo que apunta que debe ejecutarse) que seria la primera instruccion de Funcion1, Al terminar Funcion1 te encontras con un RETURN, esa instruccion lo que hace es sacar esa direccion que se guardo con el CALL y ponerlo en el contador de programa..
Algo parecido ocurre por detras en C. Pero... que pasa si le pones un GOTO ?
Principal:
CALL Funcion1
GOTO Principal ; Esto es el while(1) en C, Loop infinito
Funcion1:
;Aca instruccion
GOTO Principal
RETURN
Aca el ejemplo, si miramos de nuevo estamos en Principal, se ejecuta el CALL, es decir se guarda la direccion y salta a Funcion1, Pero luego de ejecutarse la instruccion hay un GOTO en ves de un RETURN. El GOTO es un salto a la etiqueta Principal y no saca nada de esa pila, entonces nos quedo 1 lugar de la pila ocupado. Lo cual es un problema. Si esto se ejecuta otra ves la pila se va a ir llenando hasta que se llegue al ultimo lugar que tiene y comienze a sobreescribir ese ultimo valor. Esto puede llevar a que se ejecuten varias instrucciones de mas de forma no prevista, tambien puede llevar a que no funcione correctamente el programa.
En resumen, no se lo que leiste, pero si te vas a meter con ASM, vas a tener que leer el datasheet. Pero desde ya te digo que lo que dijiste esta mal.
--------------------------------------------------------
El GOTO es siempre malo ? - Respuesta : NO.
Muchas veces el GOTO puede salvar tiempo. pero siempre y cuando se haga dentro de la misma funcion.
void funcionc (void)
{
if( xxx )
{
for(xx;x;xx)
{
if(cc)
{
goto finalizar;
}
}
}
if( y )
{
for(xx;x;xx)
{
if(cyyc)
{
goto finalizar;
}
}
}
finalizar:
xdsad = dsa;
ccsdadas++;
}