Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    今天看了下RISC-V手册然后去调戏了一下编译器看看编译器所翻译出来的汇编是什么

    D1系列-RISC-V
    1
    1
    176
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • BedRock
      BedRock LV 6 last edited by

      看了RISC-V ISC(指令集架构)的由来和发展以及宗旨,不由得觉的RISC-V确实是一个可以拿来学习使用的ISC。这里也把书安利给大家。
      见帖:安利一本书:《RISC-V 手册》
      书中做过一个非常形象的比喻:
      看ARM的指令集手册需要看半个月。😳 😳 而X86的指令集手册需要一个月。😳 😳 而且这种复杂程度上是没有一个人能够完全理解ARM和X86的,从时间的角度,RISC-V的复杂度只有ARM的 1/12 x86 的 1/10 ~ 1/30。事实上,当你了解了所有的指令之后,RISC-V的ISC指令摘要只有两页!!!😰 😰 😰

      看了一节 我就来调戏调戏 Tina 的编译器。
      首先 Hello world!!!

      #include <stdio.h>
      int main(int argc, char const *argv[])
      {
          printf("Hello world\n");
          return 0;
      }
      

      然后将他翻译成汇编文件。

      # riscv64-unknown-linux-gnu-gcc -S hello_word.c -o hello.s
      	.file	"hello_word.c"
      	.option nopic
      	.text
      	.section	.rodata
      	.align	3
      .LC0:
      	.string	"Hello world"
      	.text
      	.align	1
      	.align	4
      	.globl	main
      	.type	main, @function
      main:
      	addi	sp,sp,-32
      	sd	ra,24(sp)
      	sd	s0,16(sp)
      	addi	s0,sp,32
      	mv	a5,a0
      	sd	a1,-32(s0)
      	sw	a5,-20(s0)
      	lui	a5,%hi(.LC0)
      	addi	a0,a5,%lo(.LC0)
      	call	puts
      	li	a5,0
      	mv	a0,a5
      	ld	ra,24(sp)
      	ld	s0,16(sp)
      	addi	sp,sp,32
      	jr	ra
      	.size	main, .-main
      	.ident	"GCC: (C-SKY RISCV Tools V1.8.4 B20200702) 8.1.0"
      
      1. 可以看到gcc 翻译的汇编文件多了些 特殊的标注 可以忽略 删掉。。。
      2. 其设定指令字长的过程也可以删掉。
      3. 跳转的寄存器可以只用一个 删掉。
      4. 计算字符串地址可以只使用一个(甚至可以不用)删掉
        但是在进入main函数(其他函数也是)的栈帧不能删
        所以最后的汇编程序:
          .text
          .section .rodata #进入只读数据段
          .align 4 #字节对齐数据
      string1:
          .string "Hello,world!\n"
      .text
      .align 2
      .globl main
      main:
          addi sp,sp,-32 #分配栈指针
          sd ra,24(sp) #存储返回地址
          lui a0,%hi(string1) #计算string1的地址
          addi a0,a0,%lo(string1)
          call puts #调用printf函数
          li	a0,0 #寄存器清零
          ld ra,24(sp) #恢复返回地址
          addi sp,sp,32 # 释放栈帧
          ret
      

      最后删掉的main函数 只需要8行指令即可,比编译出翻译来的汇编少了10行😀 😀 😀 a4b95bb6-8291-4336-bf77-988a7b1d38b7-image.png

      1 Reply Last reply Reply Quote Share 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2022 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策