2012-04-09 4 views
3

Я хотел бы определить функцию, которая будет вызываться из entry_32.S. Он будет вызываться непосредственно перед вызовом реальной функции обработки вызовов.Может ли функция быть fastcall & inline в ядре linux?

Для того, чтобы избежать накладных расходов вызова функции и передачи параметров, можно объявить my_foo, как

fastcall inline int my_foo (int n); 

    /*in entry_32.S*/ 
    pushl %eax 
    CFI_ADJUST_CFA_OFFSET 4 
    SAVE_ALL 
    .... 
/* My code begins*/ 
    call my_foo 
    cmpl $0, %eax 
    jne syscall_wrong 
    movl PT_ORIG_EAX(%esp), %eax 
/* My code ends */ 
    call *sys_call_table(,%eax,4) 
+0

Я предполагаю, что синтаксис верен. Но модификатор «inline» не имеет никакого эффекта, потому что ассемблер не настолько умен, что он может заменить существующую строку «call my_foo» кодом my_foo. – Infinite

+0

inline - это всегда подсказка, которую компилятор не должен слушать, потому что в конце дня компилятор знает лучше: P Скорее всего, он будет встроен, но есть шанс, что он не может быть –

ответ

0

компилятор может встраивать функции в коде C (имеют ли они inline ключевое слово или нет), но ассемблер не так уж и умный. То, что вы пишете в сборке, - это именно то, что будет собрано, без оптимизации (например, встраивание).

Смежные вопросы