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