查看: 1558|回复: 0
收起左侧

RiscV汇编介绍(2)-编译过程

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2021-3-4 15:10:13 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2021-3-4 15:12 编辑

    RiscV汇编介绍(1)-编译过程

    RiscV汇编介绍(2)-编译过程


    elf文件全称是Executable and Linkable Format,可执行连接格式,elf文件中除了机器码以外,还有段加载地址,运行入口地址,数据段等。


    elf文件格式主要有如下三种:


    • 可重定向文件:文件保存着代码和适当的数据,用来和其它的目标文件一块儿来建立一个可执行文件或者共享目标文件。
    • 可执行文件:文件保存着一个用来执行的文件。
    • 共享目标文件:即共享库。


    elf文件详解:


    http://www.javashuo.com/article/p-unwgtgag-z.html

    https://blog.csdn.net/afterlake/article/details/53648912


    咱们用riscv工具链获得hello.c程序的汇编代码以下,对于rv32和rv64 gcc,编译出来的汇编是不同的。

    1. riscv64-unknown-elf-gcc-8.3.0  hello.c -S -o hello.s

    2.         .file   "hello.c"
    3.          .option nopic
    4.          .text
    5.          .section        .rodata
    6.          .align  3
    7. .LC0:
    8.          .string "Hello World!"
    9.          .text
    10.          .align  1
    11.          .globl  main
    12.          .type   main, @function
    13. main:
    14.          addi    sp,sp,-16
    15.          sd      ra,8(sp)
    16.          sd      s0,0(sp)
    17.          addi    s0,sp,16
    18.          lui     a5,%hi(.LC0)
    19.          addi    a0,a5,%lo(.LC0)
    20.          call    puts
    21.          li      a5,0
    22.          mv      a0,a5
    23.          ld      ra,8(sp)
    24.          ld      s0,0(sp)
    25.          addi    sp,sp,16
    26.          jr      ra
    27.          .size   main, .-main
    28.          .ident  "GCC: (GNU) 8.3.0"
    29. ~
    复制代码
    1. riscv32-unknown-elf-gcc hello.c -S -o hello1.s

    2.     .file    "hello.c"
    3.      .option nopic
    4.      .text
    5.      .section    .rodata
    6.      .align    2
    7. .LC0:
    8.      .string    "Hello World!"
    9.      .text
    10.      .align    1
    11.      .globl    main
    12.      .type    main, @function
    13. main:
    14.      addi    sp,sp,-16
    15.      sw    ra,12(sp)
    16.      sw    s0,8(sp)
    17.      addi    s0,sp,16
    18.      lui    a5,%hi(.LC0)
    19.      addi    a0,a5,%lo(.LC0)
    20.      call    puts
    21.      li    a5,0
    22.      mv    a0,a5
    23.      lw    ra,12(sp)
    24.      lw    s0,8(sp)
    25.      addi    sp,sp,16
    26.      jr    ra
    27.      .size    main, .-main
    28.      .ident    "GCC: (GNU) 8.3.0"
    复制代码

    RV32I 为程序和数据分配内存。图中的顶部是高地址,底部是低地址。


    RISC-V 软件规范中,栈指针(sp)从 0xbffffff0 开始向下增加;


    程序代码段从 0x00010000 开始,包括静态连接库;


    程序代码段结束后是静态数据区,在这个例子中假设从 0x10000000 开始;


    而后是动态数据区,由 C 语言中的alloc()函数分配,向上增加,其中包含动态连接库。


    国内芯片技术交流-RiscV汇编介绍(2)-编译过程risc-v单片机中文社区(1)


    .file    "hello.c"
         .option nopic
         .text
         .section    .rodata
         .align    2 //4字节对齐

    .LC0:
         .string    "Hello World!"
         .text
         .align    1
         .globl    main
         .type    main, @function

    main:
         addi    sp,sp,-16 //sp=x2, 调整栈指针,分配栈栈
         sw    ra,12(sp) //保存函数返回地址,就是main函数的入口地址
         sw    s0,8(sp) //s0=x8,保存s0,帧指针
         addi    s0,sp,16 //s0=栈顶地址
         lui    a5,%hi(.LC0) //计算LC0的地址,a0,…a7保存函数参数地址
         addi    a0,a5,%lo(.LC0)
         call    puts //调用puts函数,输出hello world
         li    a5,0 //读取当即数,a5=0
         mv    a0,a5 //a0=0,恢复参数地址为0

    lw    ra,12(sp) //恢复返回地址
         lw    s0,8(sp) //恢复s0,帧指针
         addi    sp,sp,16 //恢复sp
         jr    ra  // 跳转到ra地址
         .size    main, .-main
         .ident    "GCC: (GNU) 8.3.0"







    上一篇:RiscV汇编介绍(1)-编译过程
    下一篇:RISCV的linux模拟环境搭建整理和总结
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-6 08:00 , Processed in 0.300732 second(s), 48 queries .

    快速回复 返回顶部 返回列表