椚座です。
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/