c-如何将内联程序集跳转到IF条件中的另一个函数



我正试图跳转到汇编中的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

相关内容

  • 没有找到相关文章

最新更新