7745-GBA_|_Otros_|_\[THUMB_MODE]_¡Tutoriales!
#0
~Javs 12289
----------------------------------------------------------------------------------------------------------------------------
¡Elaboración de rutinas con ASM Thumb Mode!
----------------------------------------------------------------------------------------------------------------------------


Antes de comenzar; ¡Con éste tutorial no esperen terminar programando como Mastermind_X, TheTheTheThe ó ShinyQuagsire!
Se recomienda haber leído por lo menos una vez, el manual de Pey! que puede ser encontrado por el siguiente link [Tutorial ASM]

Finalidad ó propósito: Hecho para propiciar el interés sobre el campo de la investigación y el desarrollo en la población hispana dedicada al RomHacking. La superación, más que entre foros, debe ser personal, así que no se lo tomen de modo competitivo.

Sobre el tutorial: Mucha gente se reusa a leer el manual de Pey! antes de proseguir con éste, así que tendré que empezar todo desde el principio hasta que entiendan lo básico para poder seguir con los demás temas. Bien, ¡Disfrútenlo y aprendan bastante!


----------------------------------------------------------------------------------------------------------------------------
¿Qué aprenderemos en éste manual?
----------------------------------------------------------------------------------------------------------------------------


-Comandos e instrucciones básicas y avanzadas.

-Aprender la lógica y ejecución detrás de una rutina.

-Realizar una rutina propia con base a los temas anteriores.

-Modificar cualquier sector del ROM por una rutina.

-Diseñar un sistema nuevo para integrar en un ROM.

-Luego de todo ésto, te graduarás (?)

¿Ya quieren empezar? ¡Pues empecemos!


----------------------------------------------------------------------------------------------------------------------------
Comandos e intrucciones básicas y avanzadas
----------------------------------------------------------------------------------------------------------------------------


Explicaré nuevamente los comandos sencillos de una rutina, pero de una manera más fácil o un poco mejor redactada:

Registro; El registro es una especie de "Buffer" que te permite almacenar diferentes tipos de información como Offsets, Bytes, e incluso los valores de otros Registros.

Existen 15 registros en la RAM de la ROM:

-Del registro 1 al 14 (r1-r14): Son de uso complétamente libre.

-Registro 15 (r15): No se usa a menos que tu rutina sea para indicar al sistema interno de la ROM que tiene que decodificar de una manera diferente los datos ingresados o egresados que se procesen. (Ésto será explicado en una lección un poco lejana)

Pero, ¿Cómo sé qué registros está usando el ROM?

Eso es sencillo y muy útil, sobretodo por que si usas un registro que ya estaba en uso para una instrucción clave, hecharás a perder todo ese sector.

Se hace de la siguiente manera; El VBA tiene una fabulosa aplicación, llamada Disassemble. Para acceder a ella, basta con:
Tools > Disassemble.

La pantalla luce así;



Y a continuación explicaré qué significa cada cosa:

1.- Con éste, seleccionamos qué tipo de codificación queremos visualizar los datos de los registros y direcciones. (Por éstas ocaciones, recomiendo selecciónar el "Thumb Mode")

2.- Para ir a la dirección que quieras en cuanto a la RAM, para saber qué proceso está ejecutando y de qué manera.

3.- Para saber qué registros están siendo utilizados y en qué Offset se puede encontrar su valor o en qué línea de instrucción se está ejecutando.

4.- Actualiza automáticamente los registros y las líneas de comando de éstos cada frame que va pasando en tu emulador. Funcionaría como un monitor o algo parecido.

5.- Si no tienes activado el Automatic update, sirve para actualizar los registros y líneas de instrucciones hasta el frame donde se encuentra actualmente tu ROM.

Más adelante, los mostraré cómo combinar ésta fantástica herramienta con otra igual o mejor, el Search for Cheat. Pero por ahora, me parece más primordial empezar con los comandos:

LDR; Carga el valor de un Offset en un registro, ejemplo:

LDR r0, =0x02020000 'Carga el valor que se encuentre en el Offset 0x02020000 en el Registro 0 (r0).

LDR r0, [r1] 'El Registro 0 (r0) carga el valor que tenga asignado el r1.

LDR r0, [r0, r1] 'Si el r0 ya tenía un valor, sobreescribir ese valor con el que tenía más el valor que tenía el r1.

LDR r0, [r1], #0x02 'Hace que el valor del Registro 1 (r1) se sume con el valor #0x02 (2), entonces el Registro 0 (r0) obtiene el valor del total. (OJO: El valor del #0x?? debe ser en HEX)

STR/MOV; Guarda información en un registro, ejemplo:

STR r0, #0x2 'Guardamos el valor 0x2 (2) en el registro 0 (r0).

STR r1, [r0] 'Guardamos el valor del registro 1 (r1) en el registro 0 (r0).

MOV r0, #0x2 'Guardamos el valor 0x2 (2) en el registro 0 (r0).

MOV r0, r1 'Guardamos el valor del registro 1 (r1) en el registro 0 (r0).

ADD; Permite sumar los valores de los registros, ejemplo:

ADD r2, r0, r1 'Suma los valores de los registros 0 y 1 (r0 y r1) y el valor total, se escribe en el registro 2 (r2).

ADD r0, r0, r1 'Suma el valor del registro 0 (r0) con el registro 1 (r1) y el total se sobreescribe en el registro 0 (r0).

ADD r0, r0, #0x2 'Suma el valor del registro 0 (r0) con el valor #0x2 (2), y el total se sobreescibe en el registro 0 (r0).


----------------------------------------------------------------------------------------------------------------------------
La lógica y la ejecución detrás de una rutina
----------------------------------------------------------------------------------------------------------------------------


La lógica y la ejecución de una rutina se concentra en los principios del álgebra en su forma más básica. ¡Claro que sí! Así que si eres un asco para las Matemáticas (Álgebra), te recomiendo de que le des una hojeada a tu librito de Baldor y regreses después.

Continuaremos con una rutina de compra básica, como la que puso Pey! en su tutorial, pero un poco más personalizada;
(Iré poniendo cada paso con negritas con su respectiva explicación en la parte inferior del quote)

Iniciado por Pey!

@Define Lápices = 0x1
@Define Cuadernos = 0x2
@Define Dinero = 0x3

@Thumb
Push {r0, r1, r2, r3, LR}
Str r0, Lápices
Str r1, Cuadernos
Str r2, Dinero
Add r0, r0, r1
Cmp r0, r2
bGE Comprar

Comprar:
Mov r3, r0
Pop {r0, r1, r2, r3, PC}