The Odd Beard, изучи типы адресации в Ассемблере. Такого непосредственно-косвенного вызова не бывает. В твоём примере первый операнд, который номер селектора, это непосредственное значение, а второй операнд, который линейный адрес, это косвенное значение, тоесть ты всё смешал. Правильно, что вторая запись, где ты прописываешь оба непосредственных значения, у тебя сработала, так и должно быть. А если надо сделать косвенный вызов, то оба значения должны находиться в переменной-указателе, а в инструкции call прописан только адрес указателя. Сам указатель надо расширить до двух значений.
Примерно так, я не проверял. Но основной принцип такой:
Код:
int func[2]; //Первое значение - линейный адрес, второе - селектор.
func[0] = (int)&some_proc;
func[1] = 8;
asm("lcall FAR PTR $func");
После команды компиляции вызови ту же компиляцию, только с параметром -S, при этом создастся ассемблерный файл - эквивалент исходной Си программы. Файл появится с расширением .s. По нему проверишь результат.
Ещё совет - компилятору можно указать параметр
-masm=intel
тогда ассемблерные вставки можно будет писать в синтаксисе Intel.
asm("call FAR PTR [func]");