gcc内联汇编中的ljmp语法

时间:2009-11-06 05:44:42

标签: assembly inline-assembly gas segments

我正在考虑使用远程跳转来设置代码段(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"
    );
}

1 个答案:

答案 0 :(得分:2)

看起来ljmp需要常量才能工作,而这会生成更多的代码,显然不是特别安全,这似乎与我输入的值不是当前的cs值时一样,应用程序崩溃了。它使用立即值代替:

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

它并不像我想象的那样优雅,完全取决于你想要做的事情。我无法想象如果你正在编译它以在linux / windows下运行,它就会变得有用甚至无效。

相关问题