Registrarse

[ASM]¿Cómo ejecutar una rutina original como subrutina?

Estado
Cerrado para nuevas respuestas.

Kaiser de Emperana

Called in hand
Bueno, recién estoy empezando con esto del ASM y tengo un rpoblema que estuve todo el día solucionar xD

La cosa es que quiero modificar una rutina almacenada en el offset 06F540, pero no modificarla en sí, sino que quiero que haga lo mismo pero hacer otra cosa después.
Como recién estoy empezando, comencé a probar simplemente hacer una rutina que no hiciera nada, que sólo llamara a la rutina de 06F540 y la ejecutara. Y cuando lograra eso simplemente agregaba después la otra parte de la rutina (lo que quería que se ejecute después). Pero no pude hacerlo xD. El juego se detiene al se llamada mí rutina, sin hacer nada.

Quería saber si alguno me podía ayudar.

La rutina que yo inserté es esta:
Código:
.thumb
.align 2

main:
	Bl .FUNCION_ORIGINAL

.align 2
.FUNCION_ORIGINAL:
	.word 0x0806F541
Como simplemente estoy intentando llamar otra rutina sin cambiar en nada ningún dato no modifiqué ningún registro.

Bueno, saludos y gracias de antemano.
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
¿Puedes dar también el desensamblado de dicha rutina original?
De todos modos, al final de tu rutina necesitas un return ("bx lr" en thumb, si no recuerdo mal). Si no, es normal que se detenga el juego.
 

Kaiser de Emperana

Called in hand
Acabo de probar lo que me dijiste. Pero se sigue trabando. Además si hubiera sido un problema del return, supongo yo, que se ejecutaría la rutina y al terminar se trabaría.

La rutina original es la de cerrar el menú (pokedex, pokemon, mochila, etc.), o sea, la que se ejecuta cuando uno seleciona EXIT en el menú.

 

cosarara97

Dejad de cambiar de nick
Miembro de honor
Siga fallando o no, el return tiene que estar.
Quizá esa subrutina no está preparada para ser llamada fuera de contexto. Usa un debugger (el de vba-sdl-h, o el que sea) para ver lo que está pasando. Mira si llegas bien a la rutina, hasta cual de esos bl's llegas, etc.

PD: Tu código esta mal, deja que edite.
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
Código:
.thumb
.align 2

main:
	push r0, lr
	ldr r0 .FUNCION_ORIGINAL
	blx r0
	pop r0, lr
	bx lr

.align 2
.FUNCION_ORIGINAL:
	.word 0x0806F541
Esto quizá está mejor. Quizá no, tengo el thumb un poco atrofiado.

PD: ↓ La versión de eing está mejor.
PD2: Pero veo algún error xD
PD3: Nah, esta bien, solo es complicado de leer.
 
Última edición:

eing

Miembro de honor
Miembro de honor
Esto no funciona así.
Primero que nada, como ejecutas tu rutina? Si haces un callasm, llamará a la rutina mediante un bl que mencionas (que por cierto, no hagas nunca bl .offset.. Hay un máximo de tamaño de bytes, -no recuerdo cual- para hacer un salto entre rutinas- para hacer eso mejor usa ldr rx,.rutina+1 bx rx)

Algo asi:

.align 2
.thumb

Main:
Push {r0,lr} @porque la llamas desde el xse, siempre es necesario el link register
Bl rutina
Pop {r0,pc}

Rutina:
Ldr r0,.offset_rutina
Bx r0

Aunque claro, esto siempre depende, cuando hackeas una rutina te has de fijar que cuando acabe como acaba.
Si no acaba en un bx lr, nunca popeara lo que tu pusheaste, entonces se joderá el juego.
(Porque intentará popear algo anterior, a tu push..)
Asi que fjate como termina.
En tu caso bx r1, habrias de seguir debugeando y buscar un "bx lr", para que se acabe tu rutina xd


Resumiendo: no puedes popear algo, sin antes popear lo ultimo pusheado. En resumen.. LIFO (Ultimo en entrar, primero en salir).
 

Kaiser de Emperana

Called in hand
Muchas gracias a los dos. Se ve que el problema que tenía era el que menciona eing, sobre hacer bl a un offset, porque en realidad, salvo por ese punto, ya había probado la rutina que dejó eing xD

Bueno, en fin. Ahora funciona. De nuevo gracias a los dos.

Se puede cerrar el tema ^^
 
Estado
Cerrado para nuevas respuestas.
Arriba