Wikiマークアップ

遠くの関数に飛ぶときには、blhマクロを利用すると便利です。

.macro blh to, reg=r3
  ldr \reg, =\to
  mov lr, \reg
  .short 0xf800
.endm

;利用方法
blh 0x08AABBCC

b、bl、blh(macro)、は、自転車と車と飛行機のようなものです。

近くのコンビニに、飛行機で行くのは無駄です。
だから、近くのコンビニには、自転車で行きます。

1000km向こうの遠くの都市にいくときに、自転車で行くのは無謀です。
車でも辛いでしょう。
だから、飛行機を使います。

これと同じように、道具を使い分けます。

bは、近場だけに飛べます。
たいていは、同一関数内で利用されます。
近所のコンビニに自転車で行くようなものです。

blは、近郊に飛べます。
たいていは、同一のソフトウェアの関数郡の中で利用されます。
郊外の量販店に行く時に、車を使うようなものです。
多少遠くには飛べますが、とても遠くには飛べません。
また、lr(r14)レジスタに呼び出し元を記録するので、呼び出し元に簡単に戻ることが出来ます。

blh(macro)は、どこにでも呼べます。
1000km向こうの遠くの都市に行く時に飛行機を利用するようなものです。
どこに配置されるかわからないパッチでは、これを利用します。

blhの実装方法は複数あります。
呼び出すときに、レジスタを一つ使用します。
ディフォルトではr3が利用されます。
EAでのJumpToHackもr3を利用します。
r3である理由は特にないので、r0-r7の、別のレジスタを使用してもいいでしょう。

また、アドレスを格納するので、8バイト利用します。
また、4の倍数でない場所では利用できません。
その場合、余白をnopを埋めるので、合計10バイト利用します。

b2バイト近場のみ(自転車)
bl4バイト近郊のみ(車)
blh8バイトor10バイトどこでも(飛行機)