当前位置: 首页 > news >正文

百度免费咨询seo 新老网站替换 域名不变

百度免费咨询,seo 新老网站替换 域名不变,常州做网站公司哪家好,一家专门做爆品印刷的网站指令解析 这章内容进一解析更多的指令#xff0c;此外将解析指令的过程拆分为一个单独的类#xff0c;采用表格驱动的方式#xff0c;将数据和逻辑分离#xff0c;降低了 if else 嵌套层数过多。 这部分依旧改动不多#xff0c;只增加了七个指令。此外代码中细碎的变动没…指令解析 这章内容进一解析更多的指令此外将解析指令的过程拆分为一个单独的类采用表格驱动的方式将数据和逻辑分离降低了 if else 嵌套层数过多。 这部分依旧改动不多只增加了七个指令。此外代码中细碎的变动没有完全列出来下面只是主体部分的更新可以尝试自己动手实现如果简单抄一遍是没有成长的总之需要在解决问题中加深印象。可以参考这个分支的代码https://github.com/weijiew/crvemu/tree/lab3-inst 1. InstructionExecutor 接下来首先将指令解析拆分为一个单独的类 InstructionExecutor 用来专门解析指令。 class InstructionExecutor { public:static std::optionaluint64_t execute(Cpu cpu, uint32_t inst); };1.2 Cpu::execute 将 CPU 中的 execute 方法改为下面的形式 std::optionaluint64_t Cpu::execute(uint32_t inst) {auto exe InstructionExecutor::execute(*this, inst);if (exe.has_value()) {return exe;}return std::nullopt; }此前将所有指令解析都放入了一个 switch 来维护但是解析指令的个数一增加就难以维护了。 1.3 InstructionExecutor::execute 接下来讲解 InstructionExecutor::execute 如何实现表格驱动的方式来解析指令 std::optionaluint64_t executeAddi(Cpu cpu, uint32_t inst) {uint32_t rd (inst 7) 0x1f;uint32_t rs1 (inst 15) 0x1f;int64_t immediate static_castint32_t(inst 0xfff00000) 20;std::cout ADDI: x rd x rs1 immediate std::endl;cpu.regs[rd] cpu.regs[rs1] immediate;return cpu.update_pc(); }std::optionaluint64_t InstructionExecutor::execute(Cpu cpu, uint32_t inst) {uint32_t opcode inst 0x7f;uint32_t funct3 (inst 12) 0x7;// x0 is hardwired zerocpu.regs[0] 0;std::cout Executing instruction: 0x std::hex opcode , funct3: 0x funct3 std::dec std::endl;std::unordered_mapstd::tupleuint32_t, uint32_t,std::functionstd::optionaluint64_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},};auto it instructionMap.find({opcode, funct3});if (it ! instructionMap.end()) {return it-second(cpu, inst);}// 确保所有可能的执行路径都有明确的返回值 }其中维护了一张哈希表key 是有 opcode 和 funct3 组成value 对应解析指令的函数。 当执行的时候会根据解析出来 opcode 和 funct3 用来进一步跳转到对应的指令。 此外采用 C17 optional 来控制处理错误这也是为什么最后一行找不到的时候会返回 return std::nullopt; 。这部分内容可以进一步阅读这篇文章C17 optional 其中给出了 optional 出来之前是如何处理的存在哪些问题出现之后又是如何处理的。 1.2 funct7 注意 {std::make_tuple(0x13, 0x5), executefunct70X5}, 对应了多个指令。 因为所有的指令都需要 opcode 和 funct3 定位但有时候需要 funct7 进一步区分。下面的函数就是做了进一步的跳转。 std::optionaluint64_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) {// srlicase 0x00: {return executeSrli(cpu, inst);}// sraicase 0x20: {return executeSrai(cpu, inst);}default:return std::nullopt;} }2.1 指令解析 从下面的维护的哈希表中我们已经能够看到接下来需要进一步解析的指令此前 addi 和 add 已经解析完成了的。 std::unordered_mapstd::tupleuint32_t, uint32_t,std::functionstd::optionaluint64_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 类型指令功能 与Slti类似但是进行的是无符号比较。 Xori (XOR Immediate) 类型 I 类型指令功能 对寄存器中的数值与立即数进行异或操作。 Ori (OR Immediate) 类型 I 类型指令功能 对寄存器中的数值与立即数进行按位或操作。 Andi (AND Immediate) 类型 I 类型指令功能 对寄存器中的数值与立即数进行按位与操作。 Srli (Shift Right Logical Immediate) 类型 I 类型指令功能 逻辑右移将寄存器中的数值右移一个指定的位数由立即数字段指定。 Srai (Shift Right Arithmetic Immediate) 类型 I 类型指令功能 算术右移将寄存器中的数值右移一个指定的位数由立即数字段指定保持符号位不变。 这些指令提供了基本的算术运算和位操作用于实现诸如加法、减法、逻辑运算等基本操作是RISC-V指令集中用于处理整数数据的关键部分。 2.2 SLLI 指令格式 RISC-V 指令 SLLIShift Left Logical Immediate用于将寄存器中的值左移指定的位数然后将结果存储回寄存器。下面是 SLLI 指令的内部组成以及一个文本图形化的表示 31 20 15 10 6 0 ------------------------------------------------- | imm[11:0] | shamt | rd | funct3 | opcode | I-type -------------------------------------------------imm[11:0]: 12 位的立即数表示左移的位数。shamt: 移位操作数指定左移的位数范围为 0 到 31。rd: 目标寄存器用于存储结果。funct3: 功能字段对于 SLLI 指令为 001。opcode: 操作码字段指定指令类型。 例子 假设有以下 SLLI 指令 SLLI x1, x2, 4这表示将寄存器 x2 中的值左移 4 位并将结果存储回 x1。在文本图形化的内部表示中 000000000100 10000 00001 001 0110011imm[11:0] shamt rd funct3 opcodeimm[11:0] 是 000000000100表示左移的位数为 4。shamt 是 10000也就是 4 的二进制表示。rd 是 00001表示目标寄存器为 x1。funct3 是 001表示 SLLI 操作。opcode 是 0110011表示 R-type 操作。 因此SLLI x1, x2, 4 的二进制表示为 00000000010010000000010010110011。 使用场景 SLLI 指令通常用于位操作例如在实现算法时需要将某个寄存器中的值左移一定位数以进行乘法或其他算术运算。这在编写低级别的系统软件或底层硬件控制程序时可能会经常遇到。例如在实现加密算法或图形处理器中位操作是常见的操作之一。 2.3 SLTI slti 是一条有符号立即数比较指令用于将一个寄存器的值与一个立即数进行比较。下面是 slti 指令的内部组成的文本图形表示 [ immediate ] [ rs1 ] [ funct3 ] [ rd ] [ opcode ]31 20 19 15 14 12 11 7 6 0opcode操作码字段指定指令的类型。rd目标寄存器用于存储比较结果。funct3功能码字段用于指定具体的比较操作。rs1源寄存器包含待比较的值。immediate立即数与源寄存器的值进行比较。 具体来说slti 的操作是将 rs1 中的值与有符号的 immediate 相比较如果 rs1 的值小于 immediate则将目标寄存器 rd 设置为 1否则设置为 0。 以下是一个例子假设我们有如下 RISC-V 汇编代码 slti x3, x1, 10这条指令的意思是将寄存器 x1 中的值与立即数 10 进行比较如果 x1 的值小于 10则将寄存器 x3 设置为 1否则设置为 0。这样x3 将存储比较的结果表示 x1 10 的情况。 2.4 SRAI “SRAI” 的完整展开是 “Shift Right Arithmetic Immediate”其中 “S” 表示 “Shift”表示进行位移操作。“RA” 表示 “Right Arithmetic”表示是算术右移即在右移时保持符号。“I” 表示 “Immediate”表示使用一个立即数值来指定移动的位数。 因此“SRAI” 用于对有符号整数执行算术右移操作移动的位数由一个立即数值指定。 下面是一个 RISC-V 汇编指令的示例 SRAI x1, x2, 2这意味着进行算术右移立即数操作取寄存器 x2 中的值将其算术右移 2 位然后将结果存储在寄存器 x1 中。 3. 测试 因为上一部分已经增加了编译和运行汇编代码的工具函数接下来可以直接调用 TEST(RVTests, TestSlli) {std::string code start addi x2, x0, 5 \n // Load 5 into x2slli x1, x2, 3 \n; // x1 x2 3Cpu cpu rv_helper(code, test_slli, 2);// Verify if x1 has the correct valueEXPECT_EQ(cpu.regs[1], 5 3) Error: x1 should be the result of SLLI instruction;}// Test slti instructionTEST(RVTests, TestSlti) {std::string code start addi x2, x0, 8 \n // 将 8 加载到 x2 中slti x1, x2, 10 \n; // x1 (x2 10) ? 1 : 0Cpu cpu rv_helper(code, test_slti, 2);// 验证 x1 的值是否正确EXPECT_EQ(cpu.regs[1], 1) Error: x1 should be the result of SLTI instruction;}上面只是一部分内容变动没有完全列出需要参考代码来实现。 下一节会解析 load 和 store 相关的指令此外还会引入更多的现代 C 新特性并完善工具类。 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc
http://www.tj-hxxt.cn/news/134625.html

相关文章:

  • wordpress 全站搜索商务网站的规划流程
  • 邯郸移动网站建设价格十堰吧
  • 宁波网站优化技术落地页制作
  • 网站备案代码如何加到网站建设维护资质
  • 微博上如何做网站推广学校网站功能描述
  • 网站模块图甘肃网站推广
  • vue做网站好吗网和网站的区别
  • 国外超酷网站wordpress数据收集表单
  • 嘉定制作企业网站小程序模板怎么使用
  • 网站开发学习网站网站建设费摊销
  • 商城网站前置审批上传wordpress
  • 岳阳品牌网站定制开发手机网站的宽度
  • 自己做的网站怎么用qq登入贵州百度seo整站优化
  • 做网站 需要什么营业执照工业和信息化部投诉电话
  • 河北网站备案系统工地用木模板尺寸
  • 深圳那个网站建设北京室内设计公司前十名
  • 下列关于网站开发中网页上传网站建设策划书格式
  • 福州网站大全wordpress手机端编辑
  • 网站500错误 虚拟主机虚拟主机怎么建设网站
  • 网站建设需要什么技能wordpress怎么改cms
  • 黄埔区做网站城乡住房和城乡建设部网站
  • 河北涿州住房和城乡建设厅网站建设网站规模与类别
  • 给企业做网站的公司西安江苏工程造价信息网官网
  • 赵县住房和城乡建设局网站首页做网站设计需要哪些软件
  • 说明设计网站开发方案流程国外做美食视频网站
  • 无锡朝阳网站建设黄岛因特网站建设公司
  • 网站开发选择什么软件小众网站论文
  • 哪些网站是vue做的wordpress 仪表盘慢
  • 做国内贸易的网站seo搜索引擎优化实训总结
  • 给个网站做填空题上海企业登记一网通办