[H8-ML(5094)] Re: 関数名では無くアドレスに直接飛ぶには
From: Junsuke Kunugiza <jk@xxxxxxx>
Date: 2004年11月18日(木)19時35分52秒
椚座です。

On Thu, 18 Nov 2004 16:58:00 +0900
"Koji Takeuchi" <ktakeuchi@xxxxxxxxxxxxxxxxx> wrote:

> void Func_0(void)
> {
>     /* 600番地から始まるループ(関数)に飛びなさい */
>     return;
> }
> 
> 上のコメント部、/*〜*/をC言語で表現できませんでしょうか?

すでに回答が書かれていますが,絶対番地を指定した,極めて複雑な
呼び出しでも,C で記述することは可能です。自分で作る場合の
手順としては,まずただの定数に意味を与えるキャストを考えます。

ご質問の例では,0x600 は関数へのポインタであるので,

  (void (*)())0x600

というキャストを与えます(戻り値の型がないと関数へのポインタに
ならないので,ここでは void とした)。こうすることで,0x600 は
関数と等価なものになるので,これ自体を括弧でくくり,ケツに () を
つければ呼び出せるわけです。

  ((void (*)())0x600)();

ちなみに,引数がある場合なら

  ((void (*)(int))0x600)(1234);

なんて感じでやります。

このぐらいなら覚えてもいいと思いますが,「関数へのポインタへの
ポインタへのポインタ」みたいに,より複雑なものになってくると,
頭で考えるのが困難になってきます。こういうときは,簡単な英語で
述べた内容をCの宣言に変換してくれる cdecl というツールを使う手も
あります。この例なら,cdecl に

cast x into pointer to function returning void

と与えると,希望のキャストが得られます。

cdecl も,慣れていないと使いにくいのですが,手に負えなくなった
ときには有用なので,ご参考までに挙げておきます。


椚座 淳介 (Junsuke Kunugiza)
E-Mail: jk@xxxxxxx  http://www.exp.org/

スレッド概略
[5091(R)](起点)
 └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]