4

コードセグメント(CS)レジスタを設定するためにファージャンプを使用することを考えていました。なぜ私がこれを行っているのか、なぜセグメンテーションを扱っているのかを理解するにはしばらく時間がかかるので、それは学問的な課題と考えてください。構文を正しく理解できないようです。

Error: suffix or operands invalid for 'ljmp'

cs別のレジスタに入れるのはばかげていることはわかっていますが、使用が機能し%0ていなかったので試してみることにしました(axレジスタも機能しません)。

正常にコンパイルされるコードを見ていますが、同じだと思っていたので、これは私を夢中にさせていljmpます:__asm volatile ( "lcall $0x8, $far_call" );

もちろん、CS レジスタに影響を与える他のハッキーな方法を歓迎します。

void set_cs(u16 cs) {
    __asm__ volatile (
        "mov %0, %%ax \n\t"
        "ljmp %%ax, $fake_label \n\t"
        "fake_label: \n\t"
        :
        : "r" (cs)
        : "ax"
    );
}
4

1 に答える 1

2

ljmp が機能するには定数が必要なようですが、これはより多くのコードを生成し、明らかに特に安全ではありません。これは、現在の cs 値ではない値を入力すると、アプリケーションがクラッシュするように機能するようです。代わりに即時値を使用します。

#define set_cs( cs ) asm volatile ( "ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs) )

あなたが望んでいたと思うほどエレガントではなく、あなたが何をしようとしているかに完全に依存します。これをコンパイルしてLinux/Windowsで実行する場合、これが役立つか、機能するかは想像できません。

于 2009-11-25T13:03:04.840 に答える