Я думал использовать дальний прыжок, чтобы установить регистр сегмента кода (CS). Попадая в то, почему я это делаю, и почему я занимаюсь сегментацией, потребуется некоторое время, так что несите меня и считайте это академическим упражнением. Я не могу получить синтаксис правильно.Синтаксис ljmp в сборке gcc inline
Error: suffix or operands invalid for 'ljmp'
Я знаю, что это глупо ставить cs
в другой регистр, но я решил попробовать, так как с помощью %0
не работает (ax
регистр не работает либо).
Я смотрю на некоторый код, который компилируется нормально, и это сводит меня с ума, потому что я думал, что ljmp
бы то же самое: __asm volatile ("lcall $0x8, $far_call");
Я бы, конечно, приветствуем другие Hacky способы влияния на регистр 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"
);
}
Встроенная сборка - это боль в заднице; почему бы просто не писать реальные процедуры сборки в реальных файлах сборки? –
Вы уверены, что он кодируется с помощью регистров, а не сразу, читая руководство Intel? Я до сих пор не могу декодировать эту вещь :-) –