tuts_gba
Thread Id: 7745
Thread Name: 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}

#1
TrevorTS 0
we este tuto es el primero te mereces un gracias, buen aporte carnal, y nos vemos en el hack xd, que noob yay, bueno bro me gusto el tuto haber si aprendo algo :) que bueno.:D aver si no llega otro aprovechon y me quita mi compañero. :awesome:xd bueno broder gracias.
#2
errero 12445
muy bueno... la verdad que poco a poco le voy cogiendo el gusto a esto... solo que para mi qda q des una informacion basik... como se insertaria esto en un rom y com qedaria insrtado... y que aplicacion podriamos darle
aun asi el tuto es muy bueno y esta biene explicado gracias
#3
~Red 12280
Si al final va a ser cierto que los manuales de WAH no son para tontos xD.
Muchísimas gracias Javs, esto es lo que estaba buscando, un manual de ASM, en Español y para tontos xD

Ah si, te mereces un bonito gracias =D
#4
them 12312
Po fin un tutorial de ASM! Gracias y mas rputacion.
#5
~Javs 12289
we este tuto es el primero te mereces un gracias, buen aporte carnal, y nos vemos en el hack xd, que noob yay, bueno bro me gusto el tuto haber si aprendo algo Smile que bueno.Big Grin aver si no llega otro aprovechon y me quita mi compañero. :awesome:xd bueno broder gracias.


Haha, denada, para éso estoy.. Sólo soy otro más que quiere seguir la era dorada del PokéHacking =D

muy bueno... la verdad que poco a poco le voy cogiendo el gusto a esto... solo que para mi qda q des una informacion basik... como se insertaria esto en un rom y com qedaria insrtado... y que aplicacion podriamos darle
aun asi el tuto es muy bueno y esta biene explicado gracias


Tranquilo amigo, hay que saber caminar para poder correr ;D
Ésa rutina en sí no se puede insertar como tal, era sólo un ejemplo de Pey! para dar a entender sus comandos, pero yo lo pongo más detallado y para otro fin, en todo caso, el procedimiento y lógica que se usa, es igual para las PokéRutinas..

Si al final va a ser cierto que los manuales de WAH no son para tontos xD.
Muchísimas gracias Javs, esto es lo que estaba buscando, un manual de ASM, en Español y para tontos xD

Ah si, te mereces un bonito gracias =D


LOL No es para tontos man, es para principiantes, ¡Saludos y Gracias!

-------------------------------------------------------------------------------

Muchas personas me han preguntado, "¿Por qué lo posteas?, ¡luego ASM será cosa fácil!"
La verdad, es que ésto es lo mismo que pasó hace tiempo, si no hubieran personas como Areku, Koder, R!cci, Juan (PokéCo), entre otros, que en especial fueron los que más me ayudaron.. que se hubieran guardado los conocimientos para uso personal, nos hubieramos estancado en Scripts y de allí nadie pasaba..
Así que espero que ésto enrrealidad le sirva a alguien, síganme inspirando con sus comentarios xD
Saludos!
#6
errero 12445
ok javs pues si es asi entonces el tuto esta bueno y estoy deseando que sigas posteando lecciones para aprender el asm... ese gran desconocio XD
la verdad es que me habia ley el tuto de pey varias veces pero siempre me habia quedado esa duda
asias x todo y sigue trabajando que x fin alguien se dedica a enseñarnos
#7
.Jaizu! 0
Bien te quedó genial xD,bueno, solo hago ecuaciones de una incognita, eprop me lo descargo y en casa leo, te mereces un GRACIAS
#8
R!cci 13016
Como me encantan las variables y las matemáticas, por suerte para muchos esto no es tan complicado, sólo hay que organizar bien la cabeza...
Pues Javs, te felicito viejo, es hasta ahora el mejor tuto enfocado a la explicación del ASM de forma amena y sencilla... Espero que esto no se quede aquí y la comunidad continúe, ya sea tú u otros, con manuales a cerca de este tema...
#9
Mena 12512
Esto me suena mas a lenguage C++...
Por eso de las variables y definir... Tu sabes, ¿No? xD
Pues.. no hay mucho que decir mas que.. eres un maldito genio en las matemáticas xD
Porque en eso se basa todo, matemáticas.. crei que sería un poco mas.. complejo pero a como lo explicas tu va siendo mas.. entendible (?)
Muy buen tutorial Javs y me gusta que te guste compartir (?)
Espero la siguiente clase xD
#10
DaWolf 12269
Sabia que si alguien me explicaba ese manual lo entenderia :D gracias Javs sigue asi, ojala que lleges a hacer que sea mas comun encontrar una rutina asm en un hack hispano.. por cierto en el manual Pey! menciona un Advance Gold Road 2.1 si lo tienes podrias subirlo y postearlo aqui si no es mucha molestia...
#11
~Criisss 12272
Iniciado por Mena

Esto me suena mas a lenguage C++...
Por eso de las variables y definir... Tu sabes, ¿No? xD
Pues.. no hay mucho que decir mas que.. eres un maldito genio en las matemáticas xD
Porque en eso se basa todo, matemáticas.. crei que sería un poco mas.. complejo pero a como lo explicas tu va siendo mas.. entendible (?)
Muy buen tutorial Javs y me gusta que te guste compartir (?)
Espero la siguiente clase xD


En realidad en XSE tambien puedes usar tranquilamente los define, es asi como se usa la variable LASTRESULT que en realidad es la 0x800d (creo)

El manual esta muy bueno, es muy facil de entender, espero ver pronto la proxima leccion, yo nunca lo podría explicar asi xD
#12
Mena 12512
Iniciado por ~Criisss



En realidad en XSE tambien puedes usar tranquilamente los define, es asi como se usa la variable LASTRESULT que en realidad es la 0x800d (creo)

El manual esta muy bueno, es muy facil de entender, espero ver pronto la proxima leccion, yo nunca lo podría explicar asi xD


Lo se, solamente mencionaba que me sono a C++ xD
Al igual que los scripts (y al parecer ASM) todo es de lógica matemática, y saber exactamente que es lo que quieres y como quieres aplicarlo xD

Igual, creo que todo lenguaje de programacion tiene una base, no se cual sea... pero deben tenerla no? xD
#13
~Javs 12289
¡Lección #2 puesta!
Esperen la lección #3 mañana..
No pregunten, lean bien el post..
Ya saben.. Vida social (?)
#14
KODER 12428
Gran aporte men, realmente es un gran manual
sobre este tema realmente el mas entendible que
he visto, y con esto ayudas mucho a la comunidad

sale bro muy buena explicacion.

====>.:::KODER:::.<====
#15
~Red 12280
Tengo una duda :S
Concretamente en esta parte:
3- Abrimos ése ROM que se creó con un editor HEX, lo que verán, es la rutina ya compilada.. así que copiamos éso y lo pegamos en nuestro Hack en el Offset que querramos..

He abierto el ROM que se creó con el HexWorkShop, y me da todos los numeros que tu dices, pero, como pego los datos en el offset de nuestro hack?

Saludos :awesome:
#16
~Javs 12289
Iniciado por ~Sylenn

Tengo una duda :S
Concretamente en esta parte:
[quote]3- Abrimos ése ROM que se creó con un editor HEX, lo que verán, es la rutina ya compilada.. así que copiamos éso y lo pegamos en nuestro Hack en el Offset que querramos..

He abierto el ROM que se creó con el HexWorkShop, y me da todos los numeros que tu dices, pero, como pego los datos en el offset de nuestro hack?

Saludos :awesome:[/quote]

Nunca he usado el HexWorkShop, yo recomendaría el HXD..
Pero ha de ser como en otros editores HEX, CTRL + C y en tu ROM; CTRL + V xD
Abres tu Hack, buscas espacio libre (FF), pegas.. y es todo.. haha..
Saludos! ^^
#17
Pyro 26792
Muy bien hecho Javs, esta muy bueno, a ver si con este y con el de hackmew me digno a hacer cosas mas grandes. :D
#18
JV Works 12391
Muy buen tuto Javs, aunque ya eso lo sabia, pero bueno xD. Espero y sigas poniendo mas lecciones, y a ver cuando nos enseñas a surfear por la ram(Porque si no sabes hacerlo no puedes obtener los offsets basicos a usar en una rutina) xD.

En fin, solo eso, Buen aporte!!
#19
Gut_Bro 14808
¡Wow!
Muy bueno, lo entndí todo al 100%, la lógica es muy sencilla hasta ahora y espero que puedas actualizar esto más porque esta re-bueno, quisiera saber como rayos podría yo hacer aparecer una imágen en la pantallita o comprobar que hora es para que mis minis digan diferentes cosas como "Oye chiquillo... es muy tarde para andar por ahi en las calles..." xD.

¡Vamos! ¡Ánimo, somos muchos los que queremos aprender del maestro! :D
#20
Kal!ser 17506
Por la cantidad de posts que hay en este foro parece que nadie sabe ASM o.O

Gracias por el tuto, aunque de momento estoy enfrascado en los scripts tradicionales (total, para lo que necesito...) x3
#21
~Javs 12289
Iniciado por pretonegro

Por la cantidad de posts que hay en este foro parece que nadie sabe ASM o.O

Gracias por el tuto, aunque de momento estoy enfrascado en los scripts tradicionales (total, para lo que necesito...) x3


Pues en éste foro, casi nadie sabe ASM, por eso lo puse,
y sí, no lo necesitas, mejor revisa otros tutoriales.

¡Saludos!

PD: Continuará el 1 de Agosto :3
#22
Sonicarvalho 17082
Hey Javs, Buen tutorial, ayuda a empezar la jornada en el mundo de ASM.
Solo tengo una cosa a apuntar:

Iniciado por ~Javs


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

En ese caso esta correcto, pero en este...
Iniciado por ~Javs

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

... no esta!
En Ldr si, es así pero en Str, tu grabas la información en el registro dentro de los paréntesis rectos! [rX]. Solo en caso da haber uno, claro. De otra manera si, es siempre como en Ldr.

Ah, no dijiste que los tutoriales regresaban a 1 de Agosto?
Es que yo quiero ver mas cosas de ASM en este forum, no puedo ser yo solo aportando ;)

Saludos :D
#23
~Javs 12289
Ya se corrigió el punto de aquí arriba que explica sonicarvalho.
Si encuentran otro error, favor de comentarlo, gracias.

PD: En un momento más actualizo con una parte xD
¡Saludos!
#24
Alexhsar 20744
Mantiene las misma lógica de programación de C/C++, pero hay algo que no entiendo, ¿las variables solo se pueden declarar de una manera? independientemente esta sea de cualquier valor, por ejemplo: Entera, Caracter, Flotante, etc.

Espero tu respuesta y gracias por el tutorial, me ayudó en muchos aspectos.
#25
Sonicarvalho 17082
Heh... En asm, los registros son las "variables" de C++.
Un registro es un integer de 32bit, así que no tienes mucho por donde le pegar. Para crear 'Doubles' tienes que usar dos registros, uno para la parte integra y otro para la parte fraccionaria. Esto claro, solo si programas en ASM. Puedes hacer tu código en c++ y después utilizar un 'gcc' para convertir C++ en ASM o en HEX.

~Sonicarvalho