2009-11-06 6 views
4

Я думал использовать дальний прыжок, чтобы установить регистр сегмента кода (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" 
    ); 
} 
+0

Встроенная сборка - это боль в заднице; почему бы просто не писать реальные процедуры сборки в реальных файлах сборки? –

+0

Вы уверены, что он кодируется с помощью регистров, а не сразу, читая руководство Intel? Я до сих пор не могу декодировать эту вещь :-) –

ответ

2

Казалось бы LJMP требует постоянных работать, в то время как это создает больше кода и, очевидно, не особо безопасно, это, кажется, работает, как, когда я ввожу значение, которое не текущее значение CS, сбой приложения. Он использует непосредственное значение вместо:

#define set_cs(cs) asm volatile ("ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs))

Это не так элегантно, как я предполагаю, что вы хотели, чтобы это было, и полностью зависит от того, что вы пытаетесь сделать. Я не могу себе представить, что это когда-либо полезно или даже работает, если вы компилируете это для работы под linux/windows.

+2

Дальние прыжки используются в автономном коде (например, код операционной системы) для указания селекторов сегмента кода (даже в x86_64 они используются для указания уровня привилегий, то есть ядро ​​/ пользовательское пространство). Я согласен, это не имеет особого смысла в коде пространства пользователя ... – vyudh