跳转到ARM上的Naked函数

时间:2015-05-28 09:45:29

标签: c assembly arm inline

问题很简单。

我的代码是:

__attribute__ ((naked)) void function(int arg1, int arg2, int arg3)
{
   _asm("push {r0-r6}\n"
        "       .... ");
   if(checkSomeValue(arg3))
       callSomeFunction(arg1, arg2);       
}

asm代码我的期望:

push {r0-r6}
....
instruction of if ~ callSomefunction

但是..结果是:

str r1, [sp+0x0c]
str r2, [sp+0x08]  // back up register for if~ callsomefunction statement
push {r0-r6}
...

如何将我的asm代码放在函数的开头?

2 个答案:

答案 0 :(得分:2)

我的方式:

__attribute__ ((naked)) void function(int arg1, int arg2, int arg3)
{
    _asm("push {r0-r6}\n"
         "bl calleeFunction\n"
         "pop {r0-r6}\n"
         "b backToOriginal\n"
    );
}

void calleeFunction(int arg1, int arg2, int arg3)
{
   if(checkSomeValue(arg3))
      callSomeFunction(arg1, arg2);      
}

答案 1 :(得分:0)

现代c没有义务以任何特定顺序进行操作。

使用C11,指令

atomic_signal_fence(memory_order_acq_rel);

用于对语句施加顺序。在非C11编译器中,使用其他特定于编译器的命令:

gnu: __volatile__      
intel: __memory_barrier()
MS: ReadWriteBarrier()