今天看了下RISC-V手册然后去调戏了一下编译器看看编译器所翻译出来的汇编是什么
-
看了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"
- 可以看到gcc 翻译的汇编文件多了些 特殊的标注 可以忽略 删掉。。。
- 其设定指令字长的过程也可以删掉。
- 跳转的寄存器可以只用一个 删掉。
- 计算字符串地址可以只使用一个(甚至可以不用)删掉
但是在进入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行
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号