最近在除錯riscv,沒有使用工具鏈下的printf函式,自己改造了printf函式,但是除錯中發現,pintf中需要被格式化輸出的字符一直無法找到,但是字串能正常輸出。最簡demo如下:
int printf_s(const char *fmt, ...)
{
va_list vaArgP;
//
// Start the varargs processing.
//
va_start(vaArgP, fmt);
va_end(vaArgP);
return 0;
}
我現在明白的是可變引數決議需要使用va_start找到函式引數在堆疊內的地址。一般來說,fmt和vaArgP的堆疊內地址是連續的,且vaArgP表示可變引數的地址。這種用法在arm下是正常運作的。但是在riscv下發現,這樣的printf函式無法正確輸出。同樣方法下,vaArgP已經不再能正確表示可變引數部分的資料了。
反匯編看到如下匯編代碼:

自己定義的printf_s函式內的引數壓堆疊動作,a0和a1被壓進了不同的堆疊地址。a0和a1正好表示的是printf_s函式的引數。
因為這兩個地址不是連續地址,所以使用va_start得到的堆疊指標已經不能正確得到形參的地址了。
這種可變引數函式引數決議用法在arm下看著正常,但在riscv下目前看不能正確使用。
所以想請大佬給看下,在riscv下可變引數函式的引數決議怎樣才能得到正確的引數。
謝謝~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285292.html
標籤:驅動開發/核心開發