Я думал об использовании дальнего перехода для установки регистра сегмента кода (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"
);
}