RISC-V开发 linux下GCC编译自定义指令流程笔记

news2024/11/19 8:24:51

第一步:利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言

第二步:利用RSIC-V的中的.insn模板进行自定义指令的插入

第三步:RISC-V开发环境的搭建

C语言插入汇编

        GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了程序设计。使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC对这些操作有哪些限制条件。

void test(void)
  {
      input= 1;
      __asm__ __volatile__ 
      (
        "movl %1,%0" :
        "=r" (result) : 
        "r" (input)
      );
     return 1;
  }

对应的汇编代码如下;
行号   代码 解释
1
7
8  movl    $1, input                     对应C语言语句input = 1;
9  movl    input, %eax	隐式处理
10 #APP                                  GCC插入的注释,表示内嵌汇编开始
11 movl    %eax,%eax                     我们的内嵌汇编语句
12 #NO_APP                               GCC  插入的注释,表示内嵌汇编结束
13 movl    %eax, result                  将结果存入result变量,隐式处理

        “movl %1,%0”是指令模板;“%0”和“%1”代表指令的操作数,称为占位符,内嵌汇编靠它们将C语言表达式与指令操作数相对应。“result”和“input”为C语言中的两个变量名。其中result对应着%0,input对应着%1。即movl input result。

        在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求。“result”前面的限制字符串是“=r”,其中“=”表示“result”是输出操作数,“r”表示需要将“result”与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是“result”本身,当然指令执行完后需要将寄存器中的值存入变量“result”,从表面上看好像是指令直接对“result”进行操作,实际上GCC做了隐式处理,这样我们可以少写一些指令。“input”前面的“r”表示该表达式需要先放入某个寄存器,然后在指令中使用该寄存器参加运算。

RSIC-V支持自定义指令

核心思想:利用Kito Cheng提供的.insn模板进行开发

第一步:确定opcode RV32指令架构中定义了4种custom指令类型,opcode需使用表格custom-0/custom-1/custom-2/custom-3中的一种:

第二步: 确定指令类型 需要结合指令的功能来进行选择,有6种指令指令格式,分别为R/I/S/B/U/J类型

R型用于寄存器-寄存器间的操作

I型用于短立即数和访存(Load)

操作 S型用于访存Store操作

B型用于条件跳转

U型用于长立即数

J型用于无条件跳转

第三步: 确定指令编码 根据opcode以及指令类型,还需要确定其它字段的编码,比如R-type中,需要确定func3/func7字段的编码。并且编译器不会限制这两个字段的类型,支持我们自定义不同的类型来区分指令

第四步:在C语言中插入该指令

例:自定义一条指令,功能是算术运算,有两个源操作数,所以指令类型为可以选择R-type

对应的.insn模板为: .insn r opcode, func3, func7, rd, rs1, rs2

其中.insn为模板前缀 r代表该指令为R型指令 opcode使用custom-0/custom-1/custom-2/custom-3中的一种,代表这是自定义的指令 func3/func7字段可以自定义

C测试函数:

C代码
#include <stdio.h>
int main() {
	int a = 0;
	int b = 0;
	asm volatile (
       	".insn r 0x7b, 6, 6, %0, %1, x0"
       	:"=r"(a)
       	:"r"(b)
     	);	
	return 0;
}
汇编文件
main:
	addi	sp,sp,-32
	sw	s0,28(sp)
	addi	s0,sp,32
	sw	zero,-20(s0)
	sw	zero,-24(s0)
	lw	a5,-24(s0)
 #APP
# 9 "test.c" 1
	.insn r 0x7b, 6, 6, a5, a5, x0 生成的新指令
# 0 "" 2
 #NO_APP
	sw	a5,-20(s0)
	li	a5,0
	mv	a0,a5
	lw	s0,28(sp)
	addi	sp,sp,32
	jr	ra

反汇编文件

00000000 <main>:
   0:	1101                	addi	sp,sp,-32
   2:	ce22                	sw	s0,28(sp)
   4:	1000                	addi	s0,sp,32
   6:	fe042623          	sw	zero,-20(s0)
   a:	fe042423          	sw	zero,-24(s0)
   e:	fe842783          	lw	a5,-24(s0)
  12:	0c07e7fb          	.insn	4, 0x0c07e7fb 生成的新指令机器码
  16:	fef42623          	sw	a5,-20(s0)
  1a:	4781                	li	a5,0
  1c:	853e                	mv	a0,a5
  1e:	4472                	lw	s0,28(sp)
  20:	6105                	addi	sp,sp,32
  22:	8082                	ret

insn支持的所有模板如下

R type: .insn r opcode, func3, func7, rd, rs1, rs2
     +-------+-----+-----+-------+----+-------------+
     | func7 | rs2 | rs1 | func3 | rd |      opcode |
     +-------+-----+-----+-------+----+-------------+
     31      25    20    15      12   7             0

R type with 4 register operands: .insn r opcode, func3, func2, rd, rs1, rs2, rs3
     +-----+-------+-----+-----+-------+----+-------------+
     | rs3 | func2 | rs2 | rs1 | func3 | rd |      opcode |
     +-----+-------+-----+-----+-------+----+-------------+
     31    27      25    20    15      12   7             0

I type: .insn i opcode, func3, rd, rs1, simm12
     +-------------+-----+-------+----+-------------+
     |      simm12 | rs1 | func3 | rd |      opcode |
     +-------------+-----+-------+----+-------------+
     31            20    15      12   7             0

S type: .insn s opcode, func3, rd, rs1, simm12
     +--------------+-----+-----+-------+-------------+-------------+
     | simm12[11:5] | rs2 | rs1 | func3 | simm12[4:0] |      opcode |
     +--------------+-----+-----+-------+-------------+-------------+
     31             25    20    15      12            7             0

SB type: .insn sb opcode, func3, rd, rs1, symbol
SB type: .insn sb opcode, func3, rd, simm12(rs1)
     +--------------+-----+-----+-------+-------------+-------------+
     | simm21[11:5] | rs2 | rs1 | func3 | simm12[4:0] |      opcode |
     +--------------+-----+-----+-------+-------------+-------------+
     31             25    20    15      12            7             0

U type: .insn u opcode, rd, simm20
     +---------------------------+----+-------------+
     |                    simm20 | rd |      opcode |
     +---------------------------+----+-------------+
     31                          12   7             0

UJ type: .insn uj opcode, rd, symbol
     +------------+--------------+------------+---------------+----+-------------+
     | simm20[20] | simm20[10:1] | simm20[11] | simm20[19:12] | rd |      opcode |
     +------------+--------------+------------+---------------+----+-------------+
     31           30             21           20              12   7             0

CR type: .insn cr opcode2, func4, rd, rs2
     +---------+--------+-----+---------+
     |   func4 | rd/rs1 | rs2 | opcode2 |
     +---------+--------+-----+---------+
     15        12       7     2        0

	 

理论知识如上所示

下面为RISC-V开发环境的搭建
拉取码云上的riscv-gnu-toolchain镜像
git clone  https://gitee.com/mirrors/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git clone https://gitee.com/mirrors/riscv-dejagnu
git clone -b riscv-gcc-10.2.0 https://gitee.com/mirrors/riscv-gcc
git clone -b riscv-glibc-2.29 https://gitee.com/mirrors/riscv-glibc
git clone https://gitee.com/mirrors/riscv-newlib
git clone -b riscv-binutils-2.35 https://gitee.com/mirrors/riscv-binutils-gdb  riscv-binutils
git clone -b fsf-gdb-10.1-with-sim https://gitee.com/mirrors/riscv-binutils-gdb  riscv-gdb


编译工具链
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
pwd #获取当前路径 src
vi ~/.bashrc

i
export RISCV="把上面的src放到这里"
export PATH=$PATH:$RISCV/bin
:wq

source ~/.bashrc

编译riscv-gnu-toolchain

mkdir build
cd build
../configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
sudo apt install libncurses5-dev
sudo make -j4
make install

至此,C语言文件可以正常编译,但无法执行。

安装QEMU
cd
 sudo apt-get install libglib2.0-dev ninja-build  build-essential zlib1g-dev pkg-config libglib2.0-dev  \
binutils-dev libboost-all-dev autoconf libtool libssl-dev  libpixman-1-dev libpython-dev  \
 virtualenv libmount-dev   libpixman-1-dev
wget https://download.qemu.org/qemu-6.2.0.tar.xz
tar xvJf qemu-6.2.0.tar.xz
cd qemu-6.2.0
mkdir build
cd build
../configure
make -j4   #wait...
之后是获取新指令机器码的一些操作
vi test.c
riscv32-unknown-elf-gcc -S -o test.s test.c #生成汇编文件
riscv32-unknown-elf-gcc -c -o test.o test.c #生成机器码
riscv32-unknown-elf-objdump -d test.o       #反汇编查看机器码
riscv32-unknown-elf-gcc test.c -o test      #生成可执行文件
../qemu-6.2.0/build/qemu-riscv32 test       #在qemu上执行文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3.0面试题汇总

Composition API 可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api&#xff0c;解决了什么问题&#xff1f; 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺…

【Linux基础IO】Linux IO编程入门:揭秘动态库与静态库的秘密

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Linux Shell &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux基础IO &#x1f4d2;1. …

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享&#xff1a; 通过百度网盘分享的文件&#xff1a;atguigudb.sql 链接&#xff1a;https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码&#xff1a;2233 # 正中图 SEL…

Git 的安装和配置

Git 是跨平台的&#xff0c;可以在 Windows&#xff0c;Linux、Unix 和 Mac 各几大平台上使用 由于笔者主要是使用 Windows&#xff0c;其他平台下安装 Git 的方法暂且不表&#xff08;可参考廖雪峰老师的博客&#xff1a;安装 Git&#xff09; ‍ Windows 安装 Git 从 Git…

【案例73】Uclient无法读取https地址添加应用

问题现象 客户做了一个https的域名转换&#xff0c;网页端是正常访问的&#xff0c;但是在uclient里面添加应用就不行了,出来两个不对的应用&#xff0c;也安装不了&#xff0c;提示失败。 问题分析 点击添加应用发现&#xff0c;本来添加地址是https://域名:外网端口&#x…

【C++报错已解决】std::bad_alloc

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?

在当今瞬息万变的经营环境中&#xff0c;突出重围营销推广是每家企业都需要思考的问题。为了能突出重围并提升影响力&#xff0c;国内外媒体套餐内容成为了一个非常受欢迎的挑选。下面我们就为大家讲解如何运用三种不同种类的国内外媒体套餐内容来推广突出重围。 2.微博营销新浪…

GIS在构建虚拟世界中的新机遇

地理信息系统&#xff08;GIS&#xff09;技术在构建虚拟世界中扮演着越来越重要的角色。随着数字孪生、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和混合现实&#xff08;MR&#xff09;等技术的发展&#xff0c;GIS为虚拟世界提供了地理信息和…

QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用

介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面&#xff0c;显示红、黄、绿三色信号灯&#xff0c;并通过定时器控制信号灯的切换。同时&#xff0c;我们还将实现一个带有按钮的界面&#xff0c;用于展示信号灯的状态。 1. 安装Qt开…

Linux下的git开篇第一文:git的意义

目录 1.git版本控制器 2.git gitee&&github 3.Linux中gitee的使用 &#xff08; 三板斧 git add git commit -m " " git push &#xff09; 4.git log 查看之前的修改信息 &#xff08;所有提交日志&#xff09; 5.git status 查看工作目录与本地…

三防手机也能实现双卫星通信?智慧应急再添一员猛将!

随着可重复使用运载火箭技术取得显著进展&#xff0c;民营航天快速发展&#xff0c;商业卫星的发射成本不断降低&#xff0c;卫星通信全面普及的时代即将来临。遨游通讯提前布局双卫星通信技术&#xff0c;AORO M5-5G三防手机集成了天通卫星电话与北斗短报文两大国产通信技术。…

怎么将excel表格数据自动生成二维码?批量静态二维码转换的方法

在日常生活中&#xff0c;遇到需要大量二维码制作需求时&#xff0c;比如说需要给同一批产品生成不同编号的二维码时&#xff0c;有什么方法能够快速批量生成二维码呢&#xff1f;如果一个个二维码去制作不仅需要浪费大量的时间&#xff0c;而且也比较容易出错&#xff0c;那么…

MATLAB读取TIF文件,并可视化

在GIS领域&#xff0c;TIF文件则常用于存储地图、地形图等地理空间数据&#xff0c;TIF文件用于地理信息系统时&#xff0c;它通常包含地理坐标、投影信息等地理元数据&#xff0c;这些元数据使得图像能够与地理信息系统无缝集成&#xff0c;便于进行地理定位和分析。 1.读取T…

初始C++模板

1.泛型编程 1.1什么事泛型编程 在学习C语言时&#xff0c;我们时常会有这样的烦恼&#xff1a; 在针对每一种不同的类型变量进行函数传参或者是运算处理时&#xff0c;我们总是编写不同的函数或者是进行不同的处理&#xff0c;才能达到目的&#xff0c;这时&#xff0c;我们…

【JavaEE初阶】深入解析单例模式中的饿汉模式,懒汉模式的实现以及线程安全问题

前言&#xff1a; &#x1f308;上期博客&#xff1a;【JavaEE初阶】深入理解wait和notify以及线程饿死的解决-CSDN博客 &#x1f525;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 ⭐️小编会在后端开发的学习中不断更新~~~ &#x1f973;非常感谢你的…

YOLOv8改进 - 注意力篇 - 引入LSKA注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了LSKA注意力在YOLOv8中的使用。包含LSKA原理分析&#xff0c;LSKA的代码、LSKA的使用方法、以及添加以后的yaml文件及运行记录。 二、LSKA原理分析 LSKA官方论文地址&#xff1a;LSKA文章 LSKA注意力机制&#xff08;大可分…

胤娲科技:揭秘AI记忆宫殿—LLM如何用动画玩转乔丹打篮球的秘密

当AI遇上“乔丹打篮球”&#xff0c;真相竟然藏在动画里&#xff1f; 想象一下&#xff0c;你向一位AI大模型轻声询问&#xff1a;“迈克尔・乔丹从事的体育运动是……”几乎在瞬间&#xff0c;它就自信满满地回答&#xff1a;“篮球&#xff01;” 这一刻&#xff0c;你是否曾…

ROS理论与实践学习笔记——2 ROS通信机制之服务通信

服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求并产生响应结果返回给A&#xff0c;用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输…

电脑usb接口控制软件有哪些?六款软件帮你轻松管控USB端口!

小明&#xff08;疑惑地&#xff09;&#xff1a;“小李&#xff0c;我们公司最近对数据安全特别重视&#xff0c;我听说可以通过软件来控制电脑的USB接口&#xff0c;防止数据泄露。你知道有哪些好用的USB接口控制软件吗&#xff1f;” 小李&#xff08;自信地&#xff09;&a…

双十一买什么好?五大双十一好物推荐!

每年的双十一购物节都是消费者期待已久的盛事&#xff0c;届时各大电商平台纷纷推出优惠活动&#xff0c;吸引了无数购物爱好者的目光。双十一买什么好&#xff1f;为了帮助大家在双十一期间高效购物&#xff0c;我们精心挑选了五大双十一好物推荐&#xff01;这些产品不仅在品…