LDR と STR を超わかりやすく説明する [3DS改造解析ASM]
※Gateway条件コードを把握していることが必須です。
Gateway条件コード一覧 :
https://github.com/JourneyOver/CTRPF-AR-CHEAT-CODES/blob/master/ActionReplayCodeTypes.txt
※この記事を読む前にこちらの記事を必ずお読みください。
メモリからレジスタへ(ロード)コピー : GW条件では D9/DA/DB
STR( ストアレジスタ, 書き出し )命令とは
レジスタからメモリへ(ストア)コピー :GW条件では D6/D7/D8
32ビット, 16ビット. 8ビットのロード・ストア命令 :
32ビット = ワード(4バイト)
16ビット = ハーフワード(2byte)
8ビット = バイト(1byte)
LDR( ワード値を読み込む) / STR(ワード値を格納する)
LDRH(符号なしハーフワード値を読み込む) / STRH(符号なしハーフワード値を格納する)
LDRSH(符号付きハーフワード値を読み込む) / STRSH(符号付きハーフワード値を格納する)
LDRB(符号なしバイト値を読み込む) / STRB(符号なしバイト値を格納する)
LDRSB(符号付きバイト値を読み込む) / STRSB(符号付きバイト値を格納する)
GW条件コード の D9~DB は LDR~LDRSB を意味し、
D6~D8 は STR~STRSB を意味します。
GW条件コードで D9 ~ DB / D6 ~ D8 のコードを作るとします。
<例>
D9000000 00632FC0
D5000000 12345678
D6000000 00632FC0
D2000000 00000000
このコードの場合、00632FC0 のアドレスをロードし、データ(12345678)を追加、再び 00632FC0 のアドレスに追加したデータを格納しています。
つまり、00632FC0 の アドレスには データ(12345678)が格納されています。
ASM(アセンブラ)も上の例と全く同じです。
では、F0Fコードを使ってアセンブルしてみましょう!
F0F の使い方はこちら↓の記事をお読みください。
D3000000 00632FC0
D5000000 12345678
F0F00000 00000010
E5940000 E5961000
E5801000 E12FFF1E
<解説>
D3 = r4, D5 = r6
r0, r1 = 汎用レジスタ
F0F00000 00000010 = (16バイト : 4byte x 4 = 16(Hex:10))
E5940000 = LDR r0, [ r4 ]
E5961000 = LDR r1, [ r6 ]
E5801000 = STR r1, [ r0 ]
E12FFF1E = BX LR
LDR r0, [ r4 ] は メモリ内 の r4 を 汎用レジスタである r0 へコピーします。
これは D3 の指定アドレスを汎用レジスタへコピーする際は必ずやらなければいけません。つまり "初期化" を行います。
LDR r1, [ r6 ] は メモリ内 の r6 を 汎用レジスタである r1 へコピーします。
これも D5 の指定データを汎用レジスタへコピーする際は必ず行います。
ここまでで 汎用レジスタ内部を見ると、
r0 = 00632FC0
r1 = 12345678
汎用レジスタ内部はこのようになっています。
では、指定アドレスに追加データを格納しなければいけません。
ここで STR を使います。
STR r1, [ r0 ] は 汎用レジスタ の r1 を メモリ内[] の r0 へコピーします。
そうすることで、00632FC0 には 12345678 が格納されます。
最後にプログラム終了を宣言します。
BX LR