Registrarse

[Duda FR] Comando call

Estado
Cerrado para nuevas respuestas.

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
He estado probado comandos con el XSE y hoy he usado el comando call. He querido hacer un bucle que no acabe nunca. Pero después de estar un rato de darle a la B se termina el script, aquí les dejo mi script, me gustaría saber por que no es infinito el script.

#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x500
if 0x1 goto @inicio1
msgbox @text 0x6
Givepokemon 0xF 0x5 0x0 0x0 0x0 0x0
setflag 0x500
release
end

#org @inicio1
msgbox @text2 0x6
call @inicio1
end

#org @text
= Toma

#org @text2
= No me quedan
 

Xabier2012

Usuario mítico
No creo que la culpa sea del call. Igual el propio sistema de juego de tanto bucle acabó detectando el comando "end". yo quitaría ese end y en vez de call pondría goto que me gusta más. Aunque lo mejor para hacer un bucle igual es jugar con return...
 

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
Te explico: el comando call (también disponible como gosub) va a un offset, como el goto, con la diferencia de que permite usar un return luego para volver a la parte anterior.
Para como lo estás usando, deberías poner goto.

Ejemplo:

#org @main
lockall
compare 0x4050 0x4
if 0x5 call @compare2
addvar 0x4050 0x1
releaseall
end

#org @compare2
compare 0x4051 0x4
if 0x5 goto @final
return

#org @final
msgbox @finaltxt 0x6
releaseall
end

#org @finaltxt
= Niguna tiene valor 4.
 

MrNightology

Usuario mítico
He estado probado comandos con el XSE y hoy he usado el comando call. He querido hacer un bucle que no acabe nunca. Pero después de estar un rato de darle a la B se termina el script, aquí les dejo mi script, me gustaría saber por que no es infinito el script.

#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x500
if 0x1 goto @inicio1
msgbox @text 0x6
Givepokemon 0xF 0x5 0x0 0x0 0x0 0x0
setflag 0x500
release
end

#org @inicio1
msgbox @text2 0x6
call @inicio1
end

#org @text
= Toma

#org @text2
= No me quedan
Bueno, la diferencia está en que cada vez que haces un call, el procesador guarda en la pila de llamadas el PC (o Contador de Programa) de la última instrucción ejecutada en @inicio y se desplaza a la región de la memoria donde está almacenado el código de @inicio1. Cuando @inicio1 llega al final, debería ejecutar el return para restaurar/desapilar de la pila el anterior PC y volver al punto donde se quedó antes del call. SUPONGO que, al hacer un bucle con llamadas infinitas, provoca que se llene la pila y no pueda realizar más calls y, por tanto, la ejecución del script termina de forma abrupta.

Estaría bien que alguien pudiese contrastar esto xD.
Un saludo!
 

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
Bueno, la diferencia está en que cada vez que haces un call, el procesador guarda en la pila de llamadas el PC (o Contador de Programa) de la última instrucción ejecutada en @inicio y se desplaza a la región de la memoria donde está almacenado el código de @inicio1. Cuando @inicio1 llega al final, debería ejecutar el return para restaurar/desapilar de la pila el anterior PC y volver al punto donde se quedó antes del call. SUPONGO que, al hacer un bucle con llamadas infinitas, provoca que se llene la pila y no pueda realizar más calls y, por tanto, la ejecución del script termina de forma abrupta.

Estaría bien que alguien pudiese contrastar esto xD.
Un saludo!
Es probable lo que dices, suena lógico.
Pero quiero aclarar que la pila (o stack, r13) y el contador de programa (PC, r15) no son lo mismo.
Dicho eso y sabiendo que el pc almacena las instrucciones que se van ejecutando, no creo que sea allí donde se guarde el offset al que regresar. Sí podría estar en el Link Register (r14) y luego hacer un push {lr} para guardarlo en el stack (r13). Eso haría que al hacer un pop {pc} se volviera al offset en cuestión.
Otra opción es que haga un bl (guarda el offset al que regresar en el lr) y luego al terminar un bx lr.

En fin, no sé si se entiende bien, pero no quise dejar el tema tan en el aire xD
 
Estado
Cerrado para nuevas respuestas.
Arriba