esp c2 ble芯片模塊上海樂鑫科技代理商RISC-V調用約定,調用約定規范函數時參數傳遞和函數返回結果的方式和數據類型。RISC-V gcc 編譯器支持 ABI 調用約定。根據 ABI約定,RV32I 函數調用時使用a0~a7,共 8個通用寄存器傳遞參數,使用 ao 和al 兩個通用存器返回函數結果。如果超過 8 個參數,則超出部分的參數通過棧傳遞。
在示例5.7中,當函數調用“maxvalue=max(a,b);”時,a=50 傳入寄存器a0,b=150 傳入寄存器 al。esp c2 ble芯片模塊上海樂鑫科技代理商函數的結果通過寄存器 a0 返回。
示例 5.7 中的函數 max編譯后生成的匯編程序如示例 5.10 所示。在第 6、7行中將傳入的參數通過 a0 和 al 賦給變量,在第 16 行中將數結果存入寄存器a0。
示例5.10:max 匯編程序。
1 .section .text.max, "ax", @progbits
2 .global max
3 type max, @function
4 max: //在棧分配4 個整數空間
5 addisp,sp,- 16 //一個變量,int a
6 sw a0,12(sp) //第二個變量,int b
7 sw al,8(sp) //a4 = int a
8 lw a4,12(sp) //a5 = int b
9 lw a5,8(sp) //if(a4<a5) goto L2
10 lt a4,a5,.L2 //a5 = int a
11 lw a5,12(sp) //goto L3
12 j L3
13 L2:
14 lw a5,8(sp) //a5 = int b
15 L3:
16 mv a0,a5 //a0=a5,設置返回值
17 addisp,sp,16 //釋放變量空間,恢復棧指針
18 jr ra //返回主程序
esp c2 ble芯片模塊上海樂鑫科技代理商RISC-V ABI進一步規范了參數傳遞的一些細節:
1、寄存器所傳遞的標量參數的大字寬為處理器字寬(XLEN)。例如,RV321寄存器傳遞的大參數為 32 位,RV64I寄存器傳遞的大參數為 64 位。如果參數是比XLEN 窄的整數,則在寫人寄存器或棧時,先根據其符號類型擴展到 32 位,然后符號擴展到 XLEN 位。
2、寬度是 2XXLEN 位的標量參數通過一對寄存器傳遞,低 XLEN 位在低位寄存器中,高 XLEN 位在高位寄存器中。如果沒有可用的參數寄存器,則通過棧傳遞標量。如果只剩一個寄存器可用,則用寄存器傳遞低 XLEN 位,用棧傳遞高 XLEN位。
3、寬度大于 2XXLEN 的標量,通過引用(指針)傳遞,并在參數列表加入地址在示例5.7中,當函數調用“printf(“max= %d”,maxvalue)”時,一個參數的長度不確定,通過引用(指針)傳遞。
4、如果通過引用傳遞參數,調用者為返回數據分配內存,并將引用地址(指針作為調用函數時的一個參數傳遞給被調用者。
esp c2 ble芯片模塊上海樂鑫科技代理商運行程序時,為了獲得良好的性能,盡量將變量存放在寄存器而不是在內存中但同時也要避免頻繁地保存和恢復寄存器。
esp c2 ble芯片模塊上海樂鑫科技代理商RISC-V處理器的通用寄存器多,能夠存放更多臨時數據,減少保存和恢復青布器的次數,提高秘序運行性能。用 t0~t6 表示雨數調用過程中部分不需要備份賽存器,稱為臨時寄存器,用s0~s11表示在明數調用時需要備份的存器,稱為存寄存器。表4.2列出了與a0~a7、t0~t6、s0~s11 對應的通用寄存器序號。
在函數調用過程中,如果實參類型與形參類型,或者實際返回值與聲明的類型不一致,則需要對實參或返回值進行處理。
參數的傳遞方式可分為寬參數傳遞和窄參數傳遞。寬參數傳遞,被調用者把實參縮小到形參的范圍;窄參數傳遞,調用者把實參縮小到形參的范圍。
結果返回方式也分為寬返回和窄返回。寬返回,調用者把返回值縮小到函數原型所聲明的類型;窄返回,被調用者把返回值縮小到函數原型聲明的類型。esp c2 ble芯片模塊上海樂鑫科技代理商gcc 編譯器采用寬參數傳遞和寬返回方式。