アセンブリ言語講座(ASM)② [3DS改造解析]
F0F条件コードを使ってアセンブルしてみよう!
初めに ASM を HEX に直したいまたは HEX を ASM に直したい場合こちらのページをご利用ください。
[ 使い方↑ ]
開いた直後、Assembly code となっているので、
HEX to ASM に直したい場合は、⇔マークをクリックし Hex code に直してください。Hex code の欄に 目的のASMコードを知りたい場合、<例> E3A00001 を入力します。自動で変換されると思うので、ARM Big Endianの欄にある ASMコードがHex code で入力した ASMです。
[ 本題 ]
F0F条件コードとは?
F0F は Gateway条件コードに組まれている自作ASMエンジンです。
F0F の 使い方をこちらの記事ではご説明しています。
下のコードを組み立ててください。
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
を宣言し正常にプログラムは終了しました。