Если вы хотите вызвать функцию C / C ++ из встроенной сборки, вы можете сделать что-то вроде этого:
void callee() {}
void caller()
{
asm("call *%0" : : "r"(callee));
}
Затем GCC выдаст код, который выглядит следующим образом:
movl $callee, %eax
call *%eax
Это может быть проблематично, поскольку косвенный вызов разрушит конвейер на старых процессорах.
Поскольку адрес callee
в конечном итоге является константой, можно представить, что можно будет использовать i
ограничение.Цитирование из GCC онлайн документы :
`i '
Разрешается немедленный целочисленный операнд (один с постоянным значением).Это включает в себя символические константы, значения которых будут известны только во время сборки или позже.
Если я попытаюсь использовать это следующим образом:
asm("call %0" : : "i"(callee));
Я получаю следующую ошибку изассемблер:
Ошибка: суффикс или операнды недопустимы для `call '
Это потому, что GCC выдает код
call $callee
вместо
call callee
Поэтому мой вопрос заключается в том, можно ли сделать вывод GCC правильным call
.