跳转到 ARM 上的 Naked 函数
Jump to Naked function on ARM
问题很简单
我的代码是:
__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 代码放在函数的开头?
我的方式:
__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);
}
现代 c 没有义务按任何特定顺序执行操作。
使用C11,指令
atomic_signal_fence(memory_order_acq_rel);
用于对语句施加顺序。在非 C11 编译器中,使用其他编译器特定的命令:
gnu: __volatile__
intel: __memory_barrier()
MS: ReadWriteBarrier()
问题很简单
我的代码是:
__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 代码放在函数的开头?
我的方式:
__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);
}
现代 c 没有义务按任何特定顺序执行操作。
使用C11,指令
atomic_signal_fence(memory_order_acq_rel);
用于对语句施加顺序。在非 C11 编译器中,使用其他编译器特定的命令:
gnu: __volatile__
intel: __memory_barrier()
MS: ReadWriteBarrier()