遠くの関数に飛ぶときには、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バイト利用します。 |b|2バイト|近場のみ(自転車)| |bl|4バイト|近郊のみ(車)| |blh|8バイトor10バイト|どこでも(飛行機)|