我正试图跳转到汇编中的fun2
函数,因为在C中,我还没有找到一种方法,可以通过fun1
将所有可变参数传递给fun2
,而不使用类似#define fun1 (...) fun2 (__ VA_ARGS__)
的定义
问题是,如果我在if条件中移动跳转指令,代码就不起作用,我正在使用带有GCC编译器的ARMv7。
void fun2(char *format, ...){
va_list arg_list;
va_start(arg_list, format);
vprintf(format, arg_list);
va_end(arg_list);
}
//Works
void fun1(char *format, ...){
__asm__("ldr pc,=fun2");
}
bool my_condition;
//Doesn't work
void fun1(char *format, ...){
if(my_condition) {
__asm__("ldr pc,=fun2");
}
}
int main(){
fun1("test: %d", 100);
}
我试图编写一个汇编解决方案,它似乎可以工作(我看到UART端口上的日志(,但我注意到,只有当我使用R2寄存器时,这个代码才能工作,如果我使用像R3这样的任何其他寄存器,这个代码就不再工作了。我想知道这个解决方案是否只适用于运气
----根据建议修改的代码---
file1.c
__attribute__((section(".text.fun"))) void fun2(char *format, ...) {
va_list arg_list;
va_start(arg_list, format);
vprintf(format, arg_list);
va_end(arg_list);
/*...*/
}
file2.c
uint8_t *enable_trace = &(config.enable_trace);
__attribute__((naked, section(".text.fun"))) void fun1(char *format, ...) {
__asm__(
"ldr R12, =enable_trace n
ldr R12, [R12] n
ldrb R12, [R12] n
cmp R12, #1 n
beq fun2 n
bx lr");
}
int main(){
fun1("test: %d", 100);
}
编译器:Snapdragon LLVM ARM编译器4.0.3(基于LLVM.org 4.0+(
ARM Cortex A7