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

第一步:利用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,-32sw	s0,28(sp)addi	s0,sp,32sw	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_APPsw	a5,-20(s0)li	a5,0mv	a0,a5lw	s0,28(sp)addi	sp,sp,32jr	ra反汇编文件00000000 <main>:0:	1101                	addi	sp,sp,-322:	ce22                	sw	s0,28(sp)4:	1000                	addi	s0,sp,326:	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,01c:	853e                	mv	a0,a51e:	4472                	lw	s0,28(sp)20:	6105                	addi	sp,sp,3222:	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             0R 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             0I type: .insn i opcode, func3, rd, rs1, simm12+-------------+-----+-------+----+-------------+|      simm12 | rs1 | func3 | rd |      opcode |+-------------+-----+-------+----+-------------+31            20    15      12   7             0S type: .insn s opcode, func3, rd, rs1, simm12+--------------+-----+-----+-------+-------------+-------------+| simm12[11:5] | rs2 | rs1 | func3 | simm12[4:0] |      opcode |+--------------+-----+-----+-------+-------------+-------------+31             25    20    15      12            7             0SB 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             0U type: .insn u opcode, rd, simm20+---------------------------+----+-------------+|                    simm20 | rd |      opcode |+---------------------------+----+-------------+31                          12   7             0UJ type: .insn uj opcode, rd, symbol+------------+--------------+------------+---------------+----+-------------+| simm20[20] | simm20[10:1] | simm20[11] | simm20[19:12] | rd |      opcode |+------------+--------------+------------+---------------+----+-------------+31           30             21           20              12   7             0CR 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 ~/.bashrci
export RISCV="把上面的src放到这里"
export PATH=$PATH:$RISCV/bin
:wqsource ~/.bashrc编译riscv-gnu-toolchainmkdir build
cd build
../configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
sudo apt install libncurses5-dev
sudo make -j4
make install

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

安装QEMU
cdsudo 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.mzph.cn/bicheng/55898.shtml

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

相关文章

在树莓派上部署安装OAK

OAK设备可以与微型主机&#xff08;例如树莓派&#xff09;进行连接&#xff0c;在树莓派上安装DepthAI, 需要安装相关依赖Dependencies并且可以通过pip安装Depthai Library. DepthAI Library 在PyPi上对树莓派有预构建的 wheels 使用预配置的树莓派OS 镜像 我们提供预安装了D…

期权懂|面对期权下跌该如何操作呢?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;面对期权下跌该如何操作呢&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 面对期权下跌该如何操作呢&#xff1f; 首先我们需要保持冷静…

Zotero插件指南:20个工具让你的学术生活更简单

以下插件排序按照星标量进行排序&#xff0c;常用的插件大概是前20的样子&#xff0c;可以根据自己的需求进行插件的安装。 顺带提一句&#xff0c;插件不是越多越好&#xff0c;装多了可能会出现软件卡顿的情况。 1、Scholaread for Zotero 插件下载&#xff1a;插件下载 …

Linux文件权限与用户管理详解:权限、所属用户组和所有者的变更

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

HTB:Markup[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of Apache is running on the targets port 80? 2.What username:password combination logs in successfully? 使用Yakit并使用TOP1000字典对密码进行爆破 3.What is the word at the top of the page that accepts use…

以光塑形:光固化3D打印机原理图文解析

公众号端&#xff1a; 光固化打印机介绍https://mp.weixin.qq.com/s?__bizMzkwMjc0MTE3Mw&mid2247484073&idx1&sn0d0fd026b373b06cd7c340ec8f56a006&chksmc0a1af73f7d62665a632baebbde4e5e00ffb9c6bd31bf547b4a86855d5524535619a6175a428#rd 光固化打印机…

前端面试:项目细节重难点问题分享(17)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

SpringSession;基于Redis的SpringSession实现;实现session共享的三种方式

一&#xff0c;SpringSession简介 是SpringCloud下管理session的框架&#xff0c;在微服务架构中&#xff0c;由于应用了分布式的思想&#xff0c;session无法做到内存中互通&#xff0c;需要一个框架来实现各个微服务中session数据共享&#xff0c;SpringSession解决了这个问题…

C++语言学习(3): type 的概念

type 的概念 C中的变量拥有类型&#xff0c; 这是显然的。 实际上&#xff0c;每个 object&#xff0c; 每个 reference&#xff0c; 每个 function&#xff0c; 每个 expression &#xff0c; 都有对应的 type &#xff08;类型&#xff09;&#xff1a; Each object, refer…

随机掉落的项目足迹:使用箭头函数时踩到的坑

这篇博客没有啥硬核知识&#xff0c;讲的是我遇到问题然后排错的过程&#xff0c;大家可以当故事看看 事情的起因是请求响应的对象打印出来竟然是undefined&#xff0c;但是network里却可以正常看到响应体 于是我把这个问题扔给了我队友&#xff0c;他改了我两处代码&#xff…

通信工程学习:什么是OSPF开放式最短路径优先

OSPF&#xff1a;开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;被广泛应用于计算机网络中&#xff0c;特别是在构建大型和复杂的网络时。以下是对OSPF的…

Linux-磁盘优化的几个思路

优化前先看看性能指标 I/O 基准测试 fio&#xff08;Flexible I/O Tester&#xff09;正是最常用的文件系统和磁盘 I/O 性能基准测试工具。这类工具非常用&#xff0c;了解即可 应用程序优化 应用程序处于整个 I/O 栈的最上端&#xff0c;它可以通过系统调用&#xff0c;来调…

Go基础学习11-测试工具gomock和monkey的使用

文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…

UEFI学习笔记(十):系统表与ACPI表的遍历

一、概述 在 UEFI 系统表中&#xff0c;有几个关键的表用于提供系统信息、服务和硬件抽象。这些表可以通过 EFI_SYSTEM_TABLE 访问&#xff0c;常见的 UEFI 系统表如下&#xff1a; 1、EFI_SYSTEM_TABLE (系统表) EFI_SYSTEM_TABLE 是一个指针&#xff0c;包含多个服务和系统…

docker-compose无法切换用户

问题描述 jupyter:image: flink:1.19-pyprivileged: trueuser: rootports:- "9999:8888"volumes:- /data/docker_data/jupyter:/workcommand: sh -c "cd / && jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root --NotebookApp.passwordsha1:658…

『网络游戏』动态界面制作创建角色UI【02】

将上一章的登录界面隐藏 创建空物体重命名为CreateWnd 自适应铺满父物体 创建image重命名为bg并铺满 将以下资源图片放进Art文件夹 设置为精灵模式 填充背景 创建介绍Image面板与角色按钮 制作将3D模型动态防止UI界面上 首先创建RawImage 创建RenderTextures文件夹 创建Render…

数字王国里的虚拟人――技术、商业与法律解读

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【海拥导航】&#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/HDQZJEQiCJb9cFi&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技…

DS1302时钟模块(STM32)

目录 一、介绍 二、模块原理 1.原理图 2.引脚描述 3.工作原理&#xff1a;读/写时序 4.寄存器地址/定义 三、程序设计 main.c文件 ds1302.h文件 ds1302.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 DS1302是一款由达拉斯半导体&#xff08;Dallas Semic…

第三方软件测评机构简析:软件安全测试报告的内容和作用

随着数字化时代的到来&#xff0c;软件的安全性显得尤为重要。尤其在信息安全事件频发的今天&#xff0c;软件安全测试报告成为企业和开发者关注的焦点。软件安全测试报告是评估软件系统安全性的一种综合性文档&#xff0c;通常在软件开发生命周期中进行安全性测试后生成。 软…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…