我試圖跳轉到fun2匯編中的一個函式,因為在 CI 中還沒有找到將所有可變引數傳遞給fun2via的方法fun1而不使用定義之類的#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);
}
uj5u.com熱心網友回復:
我試圖撰寫一個匯編解決方案,它似乎可以作業(我看到了 UART 埠上的日志),但我注意到這個代碼只有在我使用 R2 暫存器時才有效,如果我使用像 R3 這樣的任何其他暫存器,這段代碼不會'不再作業我想知道這個解決方案是否只是為了運氣
----根據建議修改代碼---
檔案1.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);
/*...*/
}
檔案2.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 Compiler 4.0.3(基于llvm.org 4.0 )
ARM 皮質 A7
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/514015.html
