RISC-V汇编代码分析

weixin_45669632 2023-03-14 17:06:48

安装交叉编译环境

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 // 函数返回

 

...全文
70 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧