使用C++23从零实现RISC-V模拟器:指令解析(2)
使用C++23从零实现RISC-V模拟器
其中维护了一张哈希表,key 是有 opcode 和 funct3 组成,value 对应解析指令的函数。
当执行的时候会根据解析出来 opcode 和 funct3 用来进一步跳转到对应的指令。
此外采用 C++17 optional 来控制处理错误,这也是为什么最后一行找不到的时候会返回 return std::nullopt; 。
这部分内容可以进一步阅读这篇文章:C++17 optional 其中给出了 optional 出来之前是如何处理的,存在哪些问题,出现之后又是如何处理的。
1.2 funct7
注意{std::make_tuple(0x13, 0x5), executefunct70X5},对应了多个指令。
因为所有的指令都需要 opcode 和 funct3 定位,但有时候需要 funct7 进一步区分。下面的函数就是做了进一步的跳转。
std::optional<uint64_t> executefunct70X5(Cpu& cpu, uint32_t inst) {
uint32_t funct7 = (inst & 0xfe000000) >> 25;
std::cout << "Executing srli or srai funct7: 0x" << std::hex << funct7 << std::dec << std::endl;
switch (funct7) {
// srli
case 0x00: {
return executeSrli(cpu, inst);
}
// srai
case 0x20: {
return executeSrai(cpu, inst);
}
default:
return std::nullopt;
}
}
2.1 指令解析
从下面的维护的哈希表中我们已经能够看到接下来需要进一步解析的指令,此前 addi 和 add 已经解析完成了的。
std::unordered_map<
std::tuple<uint32_t, uint32_t>,
std::function<std::optional<uint64_t>(Cpu&, uint32_t)>
> instructionMap = {
{std::make_tuple(0x13, 0x0), executeAddi},
{std::make_tuple(0x13, 0x1), executeSlli},
{std::make_tuple(0x13, 0x2), executeSlti},
{std::make_tuple(0x13, 0x3), executeSltiu},
{std::make_tuple(0x13, 0x4), executeXori},
{std::make_tuple(0x13, 0x5), executefunct70X5},
{std::make_tuple(0x13, 0x6), executeOri},
{std::make_tuple(0x13, 0x7), executeAndi},
{std::make_tuple(0x33, 0x0), executeAdd},
};
新增加的指令都属于RISC-V指令集中的I(立即数)类型指令和R(寄存器-寄存器)类型指令的一部分,用于进行基本的整数运算和逻辑操作。以下是每个指令的功能和类别:
- Slli (Shift Left Logical Immediate)
- 类型:I 类型指令
- 功能:逻辑左移,将寄存器中的数值左移一个指定的位数(由立即数字段指定)。
- Slti (Set Less Than Immediate)
- 类型:I 类型指令
- 功能:将寄存器中的数值与立即数进行有符号比较,如果寄存器的值小于立即数,则将目标寄存器设置为1,否则为0。
- Sltiu (Set Less Than Immediate Unsigned)
- 类型:I 类型指令
- 功能:
相关阅读
-
注册域名的网站有哪些 网上注册平台介绍
跟大家分享注册域名的网站有哪些和网上注册平台介绍的相关经验,相关内容具体如下: 很多客户在做网站之前知道自己需要一个网址,但是却不知道怎么注册域名,在哪里注册域名,那个域
-
手动设置dns服务器什么意思 国内目前最快的DNS
IT袋网为你介绍手动设置dns服务器什么意思和国内目前最快的DNS的相关介绍,接下来就是全面介绍。 如何修改dns地址 第一步:获取DNS服务器地址 1、 首先,同时按win+R键打开运行窗口,输入c
-
OSPF点对多点非广播网络类型特点以及工作原理
本文导读:OSPF点对多点非广播网络类型特点以及工作原理的相关知识,接下来分享详细内容。 特点 点对多点非广播网络类型适用于一个路由器与多个其他路由器直接相连的情况,并且不支持
-
网络安全命令:提升网络防护的关键工具解析
小编为网友们解答网络安全命令的教程内容,一定能解决您的问题的,一起来了解吧! 网络安全对于任何一个网络系统都至关重要,对网络安全命令的掌握可以帮助我们更好地理解网络环境,


