トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

解説/ARM_asmカンペ

Last-modified: 2016-08-02 (火) 19:18:06 (267d)

armアセンブラを書く上で便利なことをまとめます。

関数呼び出し

bl 相対アドレスジャンプ。ただし、遠くへは飛べない。
b  無条件ジャンプ。ただし、遠くへは飛べない。

blとbの違いは、8086でいう callとjmpです。
現在実行している番地はpc(r15レジスタ)に格納されいます。
pcを書き換えることでjmpを実現します。

戻り先の定義は、blの場合は、スタックではなく lr(r14レジスタ)を利用します。

絶対番地へ問答無用で飛ばしたい場合は、次のようにする。

・blを置き換える命令

ldr		r1,=$08AABBCC    ;bl 08AABBCC の置き換え
mov		lr, r1
@dcw	$F800 ; pcとlrレジスタを置き換えて、戻り先の確保と、実行番地を飛ばす.

・bを置き換える命令

ldr		r1,=$08AABBCC  ;b 08AABBCC の置き換え
mov		pc, r1 ;pcを置き換えて飛ばす.

;生成されるasmコードの1バイト目が0x00になるので、
;コピペするときは、開始バイトを確認して、0x00バイトをコピーし忘れないように。

条件分岐カンペ

cmp Ra,XX としたとき
BEQ(Ra==XX)
BNE(Ra!=XX)
BGE(Ra>=XX)
BGT(Ra>XX)
BLE(Ra<=XX)
BLT(Ra<XX)

代入

数字を代入する時は、 mov を使う。

mov r0,#0x01

ポインタを代入するときは、ldrを使う。

ldr r0,=$0202BE48

ポインタを代入する時に、 movを使うと、 コンパイル(アセンブル)は成功となるが null値代入のコードが生成される。

mov r0,=$0202BE48
↓
mov r0,=$00000000 ;実際にはこういうコードが生成される。危険。

逆汗とアセンブル

逆アセンブラ

disarm -t aaa.gba > aaa.asm

アセンブル

goldroad aaa.asm

ただし、 数値データの解釈が両者異なるので注意。
disarmでは、 mov r1,#11 は、 r1に 0x11 を代入する意味だが、
goldroadでは、 mov r1,#11 は、r1に 11 を代入する意味になる。

取り違えると悲惨なことになるので、
disarmしたasmの数字データには、#0x11 と 0x をつけて16進数にしなくてはいけない。

mov r1,#11
↓
mov r1,#0x11