ASMルーチンコード作成について[3DS改造解析]
※こちらの記事ではASMルーチンコードの作成について解説していきます。
LDR = 読込命令
デスティネーションレジスタに代入する。
STR = 書出命令
STR はデスティネーションレジスタの値を
オペランドに指定されたアドレスに書き込む。
LDR/STRのバイト数リスト:
LDR 4byte / STR 4byte
LDRH 2byte / STRH 2byte
LDRB 1byte / STRB 1byte
BX = 分岐と命令セットの切り替えを行う命令
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489ij/CIHGJAEJ.html
レジスタ(r)この記事では仮とします。
r0 = 00002FF9 r1 = 45ED55AF
r2 = 0815EEC0 r3 = 0987B700
r4 = 007816B0 r5 = 00000000
r6 = 00000000 r7 = 00000003
r8 = 00180F08 r9 = 00000001
r10 = 00AA41C8 r11 = 09879EEA
r12 = 0000188C sp = 0FFFF104
lr = 00291A58 pc = 006E1804
lr = 分岐前のアドレス[Base] 0x291A58
pc = 分岐先のアドレス[Target] 0x6E1804
lr = 00291A58 E5920678 >> LDR r0, [r2, + #0x678]
[] = メモリ
# = 即値
[r2, + #0x678] は r2[0815EEC0] の基準値アドレスから #0x678 加算したアドレスを r0[00002FF9] に読み込んでいます。
pc = 006E1804 00000000 は 空きアドレスです。
ASMルーチンコードの作成に至っては、
00291A58 から 006E1804 へ分岐を行う必要があります。
※分岐については大体リンク付き分岐命令(BL)をおすすめします。
00291A58 から 006E1804 までの分岐値[加減値]を割り出すには、
16進数の計算機[電卓]を使います。
計算方法:
1. 6E1804 - 291A58 = 44FDAC
2. 44FDAC ÷ 4 = 113F6B
3. 113F6B - 2 = 113F69
A_ 113F69
分岐値が割り出せたら、
00291A58 の E5920678 を EB113F69 >> BL 0x6E1804 に 書き換えてください。
これで分岐は完了しましたが、ここからASMを組み立てていきます。
00291A58 の E5920678 は 分岐先アドレス[006E1804] でASMを組み立てる際または、組み立てた後に必ず配置してください。※もし配置しなかった場合はクラッシュします。
組み立て:
006E1804 E5920678 >> LDR r0, [r2, + #0x678]
006E1808 E3A00001 >> MOV r0, #0x1
006E180C E5820678 >> STR r0, [r2, + #0x678]
006E1810 E12FFF1E >> BX lr
00291A58 EB113F69 >> BL 0x6E1804
r0 は 元々00002FF9 でしたが、MOV r0, #0x1 によって
r0 は 00000001 にコピーされました。
新しい r0 は、STR r0, [r2, + #0x678] によって
[r2, + #0x678] したアドレスに書き出しています。
プログラムを終了するため、今回リンク付き分岐命令によって分岐が成り立っているのでBX lr でリンクを返します。
以上で解説を終了します。
お疲れ様でした(⌒∇⌒)