RISCV

阅读: 评论:0

RISCV

RISCV

RISCV-64汇编代码分析

  • RISCV简单介绍
  • 源文件
  • 汇编代码

RISCV简单介绍

寄存器

指令格式

常用指令

源文件

#include <stdio.h>
int fib(int n) {if (n <= 2)return 1;return fib(n - 1) + fib(n - 2);
}
int main() { fib(3); }

汇编代码

0000000000000628 <fib>:628:   7179                    addi    sp,sp,-48  //栈指针-4862a:   f406                    sd      ra,40(sp)  //保存函数返回地址62c:   f022                    sd      s0,32(sp)  //保存 保存寄存器的值,这些值在当前函数返回后还会被之前的函数接着使用62e:   ec26                    sd      s1,24(sp)  //同上630:   1800                    addi    s0,sp,48  //栈指针+48赋值给s0632:   87aa                    mv      a5,a0  //伪指令 复制寄存器的值 a5=a0,a0为传递来的参数634:   fcf42e23                sw      a5,-36(s0)  //*(sp-36)=a5638:   fdc42783                lw      a5,-36(s0)  //a5=*(sp-36)63c:   0007871b                sext.w  a4,a5  //将a5符号扩展 并传递给a4640:   4789                    li      a5,2  //伪指令 load立即数2642:   00e7c463                blt     a5,a4,64a <fib+0x22>//分支指令 如果a4<a5 则PC寄存器加上立即数,跳转到fib+0x22646:   4785                    li      a5,1 648:   a025                    j       670 <fib+0x48>//跳转64a:   fdc42783                lw      a5,-36(s0)  // 即传递进来的参数赋值给a564e:   37fd                    addiw   a5,a5,-1 //a5加上立即数-1650:   2781                    sext.w  a5,a5 //符号扩展652:   853e                    mv      a0,a5 //复制寄存器的值654:   fd5ff0ef                jal     ra,628 <fib>//跳转 即调用 f(n-1)658:   87aa                    mv      a5,a0 //函数调用返回值保存到a565a:   84be                    mv      s1,a5 //复制寄存器65c:   fdc42783                lw      a5,-36(s0) 660:   37f9                    addiw   a5,a5,-2662:   2781                    sext.w  a5,a5664:   853e                    mv      a0,a5666:   fc3ff0ef                jal     ra,628 <fib> 66a:   87aa                    mv      a5,a0 // 65c-66a 同 64a-65866c:   9fa5                    addw    a5,a5,s1// a5=a5+s1 f(n-1)+f(n-2)66e:   2781                    sext.w  a5,a5670:   853e                    mv      a0,a5672:   70a2                    ld      ra,40(sp) // 恢复成调用之前的状态674:   7402                    ld      s0,32(sp)676:   64e2                    ld      s1,24(sp)678:   6145                    addi    sp,sp,48 67a:   8082                    ret   //伪指令 PC=ra000000000000067c <main>:67c:   1141                    addi    sp,sp,-16 //将栈指针-1667e:   e406                    sd      ra,8(sp)  //保存函数返回地址680:   e022                    sd      s0,0(sp) // 保存寄存器由被调用者保存,保存main函数被调用之前的保存寄存器的值682:   0800                    addi    s0,sp,16//栈指针+16赋值给s0684:   450d                    li      a0,3 //a系列寄存器用户传递函数参数或者传递函数返回值686:   fa3ff0ef                jal     ra,628 <fib>//跳转指令 将返回地址(68a)保存在ra寄存器中68a:   4781                    li      a5,0 //伪指令 load立即数68c:   853e                    mv      a0,a5	//伪指令 复制寄存器的值68e:   60a2                    ld      ra,8(sp) //load ra=*(sp+8) 函数调用返回值690:   6402                    ld      s0,0(sp) //s0= *(sp) 恢复之前保存的s0的值692:   0141                    addi    sp,sp,16 //栈指针+16694:   8082                    ret //函数返回 伪指令,实际是jalr 返回地址在机器指令指定的寄存器中

本文发布于:2024-02-02 11:11:36,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170684349743405.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:RISCV
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23