我正在考虑使用远程跳转来设置代码段(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"
);
}
答案 0 :(得分:2)
看起来ljmp需要常量才能工作,而这会生成更多的代码,显然不是特别安全,这似乎与我输入的值不是当前的cs值时一样,应用程序崩溃了。它使用立即值代替:
#define set_cs( cs ) asm volatile ( "ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs) )
它并不像我想象的那样优雅,完全取决于你想要做的事情。我无法想象如果你正在编译它以在linux / windows下运行,它就会变得有用甚至无效。