アセンブリ言語講座(ASM)② [3DS改造解析]

F0F条件コードを使ってアセンブルしてみよう!

初めに ASM  を HEX に直したいまたは HEX を ASM に直したい場合こちらのページをご利用ください。

https://armconverter.com/

[ 使い方↑ ]

開いた直後、Assembly code となっているので、

HEX to ASM に直したい場合は、⇔マークをクリックし Hex code に直してください。Hex code の欄に 目的のASMコードを知りたい場合、<例> E3A00001 を入力します。自動で変換されると思うので、ARM Big Endianの欄にある ASMコードがHex code で入力した ASMです。

 

[ 本題 ]

F0F条件コードとは?

F0F は Gateway条件コードに組まれている自作ASMエンジンです。

F0F の 使い方をこちらの記事ではご説明しています。

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

 

下のコードを組み立ててください。

D3 に 空きアドレス を指定してください。

空きアドレスは RAM の データ0領域でも構いません。

D3000000 XXXXXXXX

F0F00000 00000014

E5940000 E5901000

E3A01001 E5801000

E12FFF1E 00000000

 では指定したアドレスを確認してください。

指定したアドレスの値が 1 ならこのASMコードは成立しています。

 

↑ってどういう仕組みなの?

F0F の使い方でご紹介したレジスタを使って命令(処理)で演算をしています。

D3 に 指定したアドレスは r4 に入っています。

E5940000 -> LDR r0, [ r4 ]

主記憶[メモリ]を使って r4 を 汎用レジスタの r0 第一オペランド(格納レジスタ)に読み込んでいます(格納)。

つまり、 r0 は r4 の質を持っていることと同じ意味です。

更に、汎用レジスタ r1 を使わなければならないため、

E5901000 -> LDR r1, [ r0 ]

先程の r0( D3 に指定されたアドレス ) を r1( 汎用レジスタ) へ読み込みます。

これでコード式に直すことで、XXXXXXXX ZZZZZZZZ

このような形になります。

ZZZZZZZZ = r1 なので、r1 に値を何か代入したいとなった場合

E3A01001 -> MOV r1, #1

 r1 ( ZZZZZZZZZ ) には #1 ( 定数1 ) をコピーします。

これで XXXXXXXX 00000001 になるのですが、r1 ( 00000001 ) はどこへ書き出すのでしょうか?書き出すアドレスを指定するため。

E5801000 -> STR r1, [ r0 ]

 r1 ( 00000001 ) は、主記憶の r0 ( D3 に指定されたアドレス ) へ書き出します。

そうすることで、D3 で指定したアドレスの値 r1 ( 00000001 ) が正常に書き出されます。最後にプログラム終了をしたい場合

E12FFF1E -> BX LR

 を宣言し正常にプログラムは終了しました。