LDR と STR を超わかりやすく説明する [3DS改造解析ASM]

Gateway条件コードを把握していることが必須です。

Gateway条件コード一覧 :

https://github.com/JourneyOver/CTRPF-AR-CHEAT-CODES/blob/master/ActionReplayCodeTypes.txt

※この記事を読む前にこちらの記事を必ずお読みください。 

https://nightdo.hatenablog.com/entry/2020/05/31/202242?_ga=2.211086165.1562156662.1591049795-504348120.1588957124

 

 

 

LDR( ロードレジスタ, 読み込み )命令とは

メモリからレジスタへ(ロード)コピー : 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 の使い方はこちら↓の記事をお読みください。

https://nightdo.hatenablog.com/entry/2020/05/29/202009

https://nightdo.hatenablog.com/entry/2020/05/31/215051

 

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