れーすのエグゼ流星Blog

読者です 読者をやめる 読者になる 読者になる

れーすのエグゼ流星ブログ

ロックマンエグゼ6の解析を主に行っている情報学生のBlog。プロフィールのidをクリックしてもらえると詳しい詳細が見れます。 Twitter @EXE_race

GBA解析 アセンブリの勉強 

参考文献

ARM7TDMI saizen氏の解説ページ

Assembly Programming on ARM Linux(02) ARMリファレンス

GBAFE逆汗講座 GBAFE界隈の有志様による逆汗解説

解説/ARM_asmカンペ - FE8Archives 同じくFE界隈のwiki解説

http://wisdom.sakura.ne.jp/programming/asm/index.html アセンブリ入門

アセンブリ言語の基礎知識

 

個人的メモ命令集

BGE [address](label) 大きいか等しい 符号付き整数演算でより大きいか等しい

LDRH Rd,[Rs,#imm] Rsに符号無し#imm(6bit = 62まで)を足したメモリアドレスの値をRdにハーフワードロード

STRH Rd,[Rs,Rn] RsとRnを足したメモリアドレスにRdをハーフワードストア(2Byte)書き込み命令

BL [address](label) [PC±4MB]に強制分岐。今実行してるプログラムのアドレスから±409600Byte
ブランチとリンク。これはアドレスにジャンプし、r14を更新します。
これは、サブルーチンを呼び出すために使用されます。

MUL Rd,Rs RdをRsの値で積算

LDR Rd,[Rs,Rn] RsとRnを足したメモリアドレスの値をRdにワードロード(4Byte)

LDRB Rd,[Rs,Rn] RsとRnを足したメモリアドレスの値をRdにバイトロード(1Byte)

ADD Rd,Rs,Rn RsとRnを加算しRdに格納

BNE [address](label) 等しくない 比較結果が等しくないかゼロでない Z = 0

 

レジスタ

r0~r12 汎用レジスタ

 

r13はスタックポインタ

スタック専用のレジスタで、スタックが保持される

スタックは普通、何かのデータを一時保管用するために使用されます。たとえば、一時的にレジスタの中にあるデータをスタックへ積み(データの回避)、レジスタを別の目的に使用した後、スタックからデータを戻す(データの復元)ように使用されます。

push rr ;(SP) ← rr

pop rr ;rr ← (SP)

 

r14(LR)はリンクレジスタ 

BL 命令(サブルーチンコール)で分岐した場合の戻りアドレス を保持します

リンクレジスタは1つの戻りアドレスしか保持できないため、 スタック (普通は r13 が示す領域) に保存する場合が多くなります。

リンクレジスタがないとサブルーチンが終了した際に元の場所に戻ることができなくなる

 

r15(PC)はプログラムカウンタ 

実行中のメモリアドレスを保持しており、分岐する際の飛び先アドレスになる

 

BL命令の場合は予めr14(LR)に”戻りアドレス”を保持する

通常はサブルーチンの最初にr14(LR)をスタック、最後にr15(PC)にポップすることでr14(LR)→r15(PC)の代入を実現

よって飛び元に戻ることができる

(サブルーチン→サブルーチンが出来ないが、 mov r15 r14でも可能)

 

まとめる前メモ

lsl 論理左シフト 1回左シフトすれば2倍、1回右シフトすれば1/2倍です

bl サブルーチン

論理シフト
mov r0, #24
ldsb r0, [r4, r0] ;;体格ロード
asr r0, r0, #1 ;;1/2に
mov r2, #18
ldsb r2, [r4, r2] ;;力ロード
asr r2, r2, #2 ;;1/4に
add r0, r0, r2
mov r2, #19
ldsb r2, [r4, r2] ;;技ロード
asr r2, r2, #2 ;;1/4に
add r0, r0, r2

 

覚えておくべきことは、命令にSを追加すると(ANDS、SUBS、ADDSなど)、ステータスフラグが設定されることです。ループ内のS(第1章の最初のプログラムのような)を使用するのを忘れて、条件付きブランチを実行しようとすると、無限ループやその他の悪いバグが発生します。