571
社区成员
发帖
与我相关
我的任务
分享
apt-get install g++-riscv64-linux-gnu binutils-riscv64-linux-gnu
#include<stdio.h>
int fib(int n){
if(n<=2) return 1;
return fib(n-1)+fib(n-2);
}
int main(){
printf("%d", fib(3));
return 0;
}
riscv64-linux-gnu-gcc filename
riscv64-linux-gnu-objdump -d a.out > fib.txt // a.out是默认的可执行文件名
0000000000000668 <_Z3fibi>:
668: 7179 addi sp,sp,-48
66a: f406 sd ra,40(sp)
66c: f022 sd s0,32(sp)
66e: ec26 sd s1,24(sp)
670: 1800 addi s0,sp,48
672: 87aa mv a5,a0
674: fcf42e23 sw a5,-36(s0) // *(s0-36)=a5, 数据类型为word
678: fdc42783 lw a5,-36(s0)// a5=*(s0-36), 数据类型为word
67c: 0007871b sext.w a4,a5 // 符号扩展
680: 4789 li a5,2
682: 00e7c463 blt a5,a4,68a <_Z3fibi+0x22> // 分支指令,如果a4<a5 则PC寄存器加上立即数,跳转到fib+0x22
686: 4785 li a5,1
688: a025 j 6b0 <_Z3fibi+0x48> // 跳转
68a: fdc42783 lw a5,-36(s0)
68e: 37fd addiw a5,a5,-1 //a5=a5-1, 寻址方式为立即数且数据类型为word
690: 2781 sext.w a5,a5
692: 853e mv a0,a5
694: fd5ff0ef jal ra,668 <_Z3fibi> // 跳转,即调用fib(n-1)
698: 87aa mv a5,a0
69a: 84be mv s1,a5
69c: fdc42783 lw a5,-36(s0)
6a0: 37f9 addiw a5,a5,-2
6a2: 2781 sext.w a5,a5
6a4: 853e mv a0,a5
6a6: fc3ff0ef jal ra,668 <_Z3fibi>
6aa: 87aa mv a5,a0
6ac: 9fa5 addw a5,a5,s1
6ae: 2781 sext.w a5,a5
6b0: 853e mv a0,a5
6b2: 70a2 ld ra,40(sp)
6b4: 7402 ld s0,32(sp)
6b6: 64e2 ld s1,24(sp)
6b8: 6145 addi sp,sp,48
6ba: 8082 ret
00000000000006bc <main>:
6bc: 1141 addi sp,sp,-16
6be: e406 sd ra,8(sp) // *(sp+8)=ra,数据类型为double word
6c0: e022 sd s0,0(sp) // *(sp)=s0, 数据类型为double word
6c2: 0800 addi s0,sp,16 // s0=sp+16,寻址方式为立即数
6c4: 450d li a0,3 // load立即数
6c6: fa3ff0ef jal ra,668 <_Z3fibi> // 跳转到668,保存返回地址6ca到ra
6ca: 87aa mv a5,a0
6cc: 85be mv a1,a5
6ce: 00000517 auipc a0,0x0 // rd = pc + sext(immediate[31:12] << 12)
6d2: 02250513 addi a0,a0,34 # 6f0 <_IO_stdin_used+0x8>
6d6: ecbff0ef jal ra,5a0 <printf@plt>
6da: 4781 li a5,0
6dc: 853e mv a0,a5
6de: 60a2 ld ra,8(sp) // ra=*(sp+8), 数据类型为double word
6e0: 6402 ld s0,0(sp) // sp=*(sp), 数据类型为double word
6e2: 0141 addi sp,sp,16
6e4: 8082 ret // 函数返回