Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

C言語でジャンプする方法は?


「CS+ 版RX シリアルデバッガ 取り扱い説明書」を見て、次のように書けば関数として呼び出せる事を知りました。

((void(*)(void))  0x00001000)( )

 

知りたい事が二つ有ります。

・関数呼び出しなのでアセンブラのコール命令に成りますが、ジャンプ命令にする書き方は有りますか?

・或るアドレスに書いてあるアドレスを読んで、そのアドレスにコールまたはジャンプする方法は有りますか?

  • わわいです
    ・ありません。素直にインラインアセンブラを使いましょう
    ・関数ポインタを定義してそれを呼び出します

    void (*hogehoge)(void);
    hogehohe=(void*)(*(uintptr_t*)どこかのアドレス);
    hogehoge();

    ・もひとつ(動かしてないので要確認)
    typedef void(*FUNC)();
    FUNC* hogehoge=(void*)どこかのアドレス;
    (*hogehoge)();

  • > ・関数呼び出しなのでアセンブラのコール命令に成りますが、ジャンプ命令にする書き方は有りますか?

    gcc を使えば可能です。

    $ type hoge.c
    int hoge(void)
    {
        goto *(void**)0x12345678;
    }
    
    $ rx-elf-gcc -O2 -S hoge.c -o -
            .file   "hoge.c"
            .section P,"ax"
            .global _hoge
            .type   _hoge, @function
    _hoge:
            mov.L   #0x12345678, r5
            jmp     r5
            .size   _hoge, .-_hoge
            .ident  "GCC: (GCC_Build_20181126) 4.8.4.201803-GNURX"
    
    $
    
  • In reply to fujita nozomu:

    わわいさん、fujita nozomu さん、書き込み有難う御座います。
    次の実験で上手く行きました。

    HEWを使っているのですが、最適化レベルをMaxから0にしたら0番地に書けなかった。
    定数にLを付けたら思った通りに動くようになりました。
    他の所を弄ってから再度確認のためLを外したら、問題無かった。
    不可解だな。

    void** P ; // ポインタのポインタ
    void** Q ; // ポインタのポインタ

    P = 0x0 ; // ポインタにゼロ番地を設定
    *P = (void*) 0x11F1 ; // ゼロ番地に、コール先アドレスを書き込む

    Q = 0x0L ; // ポインタにゼロ番地を設定
    ((void(*)(void)) *Q )() ; // ゼロ番地に書かれているアドレスをコール
  • In reply to リカルド:

    > 0番地に書けなかった。

    C の仕様的に保証できない操作では

  • In reply to リカルド:

    > 定数にLを付けたら思った通りに動くようになりました。

    x64 用に clang でコンパイルするとこんな感じです。

    https://godbolt.org/z/3cvtze
    en.wikipedia.org/.../X86_instruction_listings
  • In reply to リカルド:

    0x11F1 を呼び出したいなら下記で良いのでは

    $ type hoge.c
    void hoge(void)
    {
        ((void(*)(void))0x11F1)();
    }
    
    $ rx-elf-gcc -O2 -S hoge.c -o -
            .file   "hoge.c"
            .section P,"ax"
            .global _hoge
            .type   _hoge, @function
    _hoge:
            mov.L   #0x11f1, r5
            jsr     r5
            rts
            .size   _hoge, .-_hoge
            .ident  "GCC: (GCC_Build_20181126) 4.8.4.201803-GNURX"
    
    $
    
  • In reply to fujita nozomu:

    fujita nozomu さん、

    ルネサス提供の無料の H8/3049 モニターはご存知ですか?
    RAMにプログラムをロードして、プログラムの練習が出来るモニターです。
    割り込みベクターはROMに書いてあるので、そのままでは割り込みの練習が出来ません。
    それで割り込みが有ったときROMに書いてあるプログラムに飛び、そのプログラムでRAMに書いてあるベクターを読んでユーザーが作った割り込み処理をしています。

     それと同じ事がしたいのです。ですから、「有るアドレスに書いてあるアドレスを引っ張って来て実行する」と言うのがポイントです。
  • In reply to リカルド:

    > 割り込みベクターはROMに書いてあるので、そのままでは割り込みの練習が出来ません。

    RX の可変ベクターテーブルの仕組みは理解されてますか?
  • In reply to リカルド:

    わわいです。
    その前提となるところを質問に書いとけばよかったんでは。
  • In reply to fujita nozomu:

    >RX の可変ベクターテーブルの仕組みは理解されてますか?

     分るけど、「それじゃあ、これも知っているのか!」と言うような何か深い突っ込みでも有るんですか?

     固定ベクタを知ってますか。この中の割り込みを可変ベクターテーブルの空いている所に書いて、それを呼び出す方法を考えていて質問したのですが。
  • In reply to わわい:

    >その前提となるところを質問に書いとけばよかったんでは。

     「アセンブラならこう書くけど、C言語で書く方法はあるのか?」と言う、C言語の一般論と言うつもりで質問しました。
  • In reply to リカルド:

    >> 割り込みベクターはROMに書いてあるので、そのままでは割り込みの練習が出来ません。
    >> それで割り込みが有ったときROMに書いてあるプログラムに飛び、そのプログラムでRAMに書いてあるベクターを読んでユーザーが作った割り込み処理をしています。
    >> それと同じ事がしたいのです。

    > この中の割り込みを可変ベクターテーブルの空いている所に書いて、

    可変ベクターテーブルは RAM 上に配置可能では?

    > それを呼び出す方法を考えていて質問したのですが。

    可変ベクターテーブルに登録された割り込み処理を呼び出す専用の INT 命令というのがありますよ。
  • In reply to fujita nozomu:

    >> この中の割り込みを可変ベクターテーブルの空いている所に書いて、

    > 可変ベクターテーブルは RAM 上に配置可能では?

    >> それを呼び出す方法を考えていて質問したのですが。

    > 可変ベクターテーブルに登録された割り込み処理を呼び出す専用の INT 命令というのがありますよ。

     固定ベクターに有るNMIなどの実験を、固定ベクトルの書いてあるROMはいじらずRAMの書き換えだけで出来ないかと言うのが目的です。
     NMIが入ったときROM内のプログラムに飛び、可変ベクターテーブルの空いた所に書いたベクターを読み、そこに飛ぶと言うプログラムです。
     可変ベクターテーブルは RAM 上に書いてあります。
  • In reply to リカルド:

    > 固定ベクターに有るNMIなどの実験を、固定ベクトルの書いてあるROMはいじらずRAMの書き換えだけで出来ないかと言うのが目的です。
    > NMIが入ったときROM内のプログラムに飛び、可変ベクターテーブルの空いた所に書いたベクターを読み、そこに飛ぶと言うプログラムです。
    > 可変ベクターテーブルは RAM 上に書いてあります。

    なんでされたいことを最初から明らかにされないんですか?? 他人の労力を無駄に浪費させてるだけでは。
  • In reply to fujita nozomu:

    >なんでされたいことを最初から明らかにされないんですか?? 他人の労力を無駄に浪費させてるだけでは。

    えっ、初めの質問に次のように書いて有りますよ。

    ・或るアドレスに書いてあるアドレスを読んで、そのアドレスにコールまたはジャンプする方法は有りますか?

    2019/1/1 14:21  付けで自分で解決策を見つけたとも書いてあります。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page