我正在学习函数序言,并试图理解GCC为什么要做它。
这是我简单的C函数:
#include <stdint.h>
int add(uint8_t num) {
return num + num;
}
将此代码放入riscv64 gcc 7.2.0的编译器浏览器(例如此https://cx.rv8.io/)中,而未应用优化标志将导致以下汇编:
add(unsigned char):
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
mv a5,a0
sb a5,-17(s0)
; end function prologue
lbu a5,-17(s0)
sext.w a5,a5
slliw a5,a5,1
sext.w a5,a5
; start function epilogue
mv a0,a5
ld s0,24(sp)
addi sp,sp,32
jr ra
a0
中的第一个输入arg复制到a5
中?为什么不简单地在整个函数中对寄存器a0
进行操作?sb
将arg存储在堆栈中,然后立即使用a5
将arg从堆栈中加载到lbu
中呢? a5
已具有此值。我知道这没有应用任何优化,但是即使对于“无优化”方案,我也觉得对于编译器而言这很奇怪。
以下是寄存器列表及其对不熟悉RISC-V的人员的用途:https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md#general-registers