4

我正在考虑使用远跳转来设置代码段(CS)寄存器。了解我为什么要这样做以及我为什么要处理细分需要一段时间,所以请耐心等待,并将其视为学术练习。我似乎无法正确使用语法。

Error: suffix or operands invalid for 'ljmp'

我知道cs放入另一个寄存器是愚蠢的,但我想我会尝试它,因为 using%0不起作用(ax寄存器也不起作用)。

我正在查看一些编译良好的代码,这让我发疯,因为我认为ljmp会是一样的:__asm volatile ( "lcall $0x8, $far_call" );

我当然欢迎其他影响 CS 寄存器的 hacky 方式。

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 回答