我在考虑使用far jump来设置代码段(CS)寄存器。解释我为什么要这样做以及为什么我要处理分段需要花费一些时间,所以请耐心等待并将其视为学术练习。我似乎无法正确使用语法。
错误:'ljmp'的后缀或操作数无效
我知道将cs放入另一个寄存器中是愚蠢的,但我认为我应该尝试一下,因为使用%0不起作用(ax寄存器也不起作用)。
我正在查看一些编译良好的代码,这让我感到疯狂,因为我认为ljmp会是相同的:
__asm volatile ( "lcall $0x8, $far_call" );
当然,我也欢迎其他影响CS寄存器的hacky方法。
错误:'ljmp'的后缀或操作数无效
我知道将cs放入另一个寄存器中是愚蠢的,但我认为我应该尝试一下,因为使用%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"
);
}