外贸做的好的网站,工作人员回应游客扔免费午餐,泉州最专业微信网站建设开发,title 镇江网站建设#x1f3af;要点
#x1f3af;使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编#x1f3af;RISC-V汇编加载和算术。#x1f3af;使用GNU MAKE汇编RISC-V指令#xff0c;ESP32使用CMake编译执行指令。#x1f3af;RISC-V汇编功能和使用释义#xff1a;控制指令要点
使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编RISC-V汇编加载和算术。使用GNU MAKE汇编RISC-V指令ESP32使用CMake编译执行指令。RISC-V汇编功能和使用释义控制指令内存管理功能块和堆栈。 使用RISC-V汇编代码控制GPIO。RISC-V汇编指令嵌入C 代码C代码调用汇编指令控制Python代码调用RISC-V汇编指令。RISC-V数学计算汇编指令矩阵乘法示例。使用模拟器测试RISC-V浮点运算。RISC-V汇编代码优化使用渗透工具将RISC-V汇编和C 代码之间关系。ESP32-C3使用RISC-V 汇编安装RISC-V模拟器编译调试。 C代码和RISC-V汇编示例132位整数累加。C代码和RISC-V汇编示例2控制LED闪烁C代码和RISC-V汇编示例3奇校验。C代码和RISC-V汇编示例4加载和存储。C代码和RISC-V汇编示例5摄氏度数据。C代码和RISC-V汇编示例6调用程序指令。C代码和RISC-V汇编示例7程序流控制。C代码和RISC-V汇编示例8算术运算。C代码和RISC-V汇编示例9乘法除法。C代码和RISC-V汇编示例10寻址、下标和字符串。C代码和RISC-V汇编示例11浮点处理。C代码和RISC-V汇编示例12使用GCC处理测试代码。C代码和RISC-V汇编示例13控制拓展。C代码和RISC-V汇编示例14内嵌汇编。 5.安装FPGA开发工具HLS和IDE创建和模拟IP。 安装和使用RISC-V工具链模拟器/调试器调试C代码示例。RV32IRISC-V汇编示例C代码和汇编代码。更新程序计数器的路径C代码顶层函数原型读取内存数组函数执行函数IP运行条件函数使用测试平台进行 IP 仿真FPGA开发板测试IP构建 RISC-V 指令编码填充执行阶段构建寄存器路径。构建RISC-V处理器C代码RV32I 顶层函数更新指令编码计算访问地址使用测试平台模拟RV32IFPGA开发板测试IP。自编汇编代码测试RISC-V处理器使用RISC-V ISA模拟器测试在 Rv32I 处理器上运行基准测试套件使 Rv32I IP 适应 RISC-V F 扩展。构建流水线 RISC-V 处理器C代码级间传输类型定义IP 顶层函数编码函数执行函数IP的仿真与综合Vivado项目使用该IP将流水线分为多个阶段。使用多周期流水线构建 RISC-V 处理器C代码使用多个 Hart 流水线构建 RISC-V 处理器互连 IP 构建多核RISC-V处理器使用 Multihart 内核的多核 RISC-V 处理器开发板使用RISC-V处理器。
RISC-V汇编
输入Doubler
您应该知道RISC-V 函数的输入位于寄存器 a0、a1 至 a7 中。这些只是从 x10 开始的寄存器的别名。
doubler:ADD a0, a0, a0为了测试这一点请在模拟器中运行代码之前在寄存器 a0 中放置一个初始值。如果有效那么 a0 应该加倍。函数应该在 a0 中返回结果所以这是正确的方法。
如果这是从其他地方调用的真实函数我们将需要在最后一行从函数返回
JALR zero, ra, 0通常RISC-V汇编器会有一条伪指令RET来实现这一点。
该指令如何运作在真实的程序中我们以 42 作为参数调用的倍增函数必须写成这样
ADDI a0, zero, 42
JAL ra, doubler
SUB t3, t4, t2这意味着返回地址存储在 ra (x1) 寄存器中因此当 doubler 返回时它开始执行 SUB t3、t4、t2 指令。这意味着什么只是我放在那里的任意指令。
乘八
这次我要你将 input 的输入乘以 8。基本 RISC-V ISA 没有乘法指令我们使用的解释器没有任何支持除法和乘法的 RISC-V M 扩展。
加法
从概念上讲乘法只是重复加法所以这可能是最明显的解决方案
eight_times:ADD a0, a0, a0ADD a0, a0, a0ADD a0, a0, a0HLT # Stop execution使用逻辑移位
在二进制数系统中将所有数字向左移动一位与乘以二相同。移动两个位置就像乘以四。
010b 2
010b 1 100b 4
001b 2 100b在 RISC-V 汇编中我们使用 SLLI 和 SLL 执行左移。 I 后缀表示我们使用立即值而不是寄存器来指定要移位的位置数。
eight_times:SLLI a0, a0, 3JALR zero, ra, 0HTL # Stop excution. Normally you put RET寻找最大值
这是公共函数 c max(a, b) 的实现它将 a 或 b 中较大的值分配给 c。要解决这个问题需要使用跳转和分支指令。有关如何将值从一个寄存器移动到另一个寄存器的提示是您可以使用 ADD 或 ADDI 指令。
普通的 RISC-V 汇编代码有一个称为 MV 的伪指令我们在这里无法访问它但以下这两行是等效的
MV a4, a3
ADDI a4, a3, 0查看下面的解决方法
max:BLT a0, a1, second # if a0 a1 then a1 is largerJAL zero, done
second:ADD a0, zero, a1 # make a1 the return value
done:HLT # normally a RET would be here如果你没搞清楚这一点。您可以尝试实现 min 函数。
简单乘数
我们不用与固定数字相乘而是将两个任意数字相乘。 在这种情况下您可以仅使用添加和分支。 它不需要是高效的。 该函数将 a0 和 a1 中的两个参数相乘并像往常一样在 a0 中返回结果。
multiply:ADD t0, zero, zeroADDI a1, a1, -1
accumulate:ADD t0, t0, a0ADDI a1, a1, -1BGE a1, zero, accumulateADD a0, zero, t0HLT由于我们的解释器缺少大量 RISC-V 指令因此它的长度稍长可读性也较差。
multiply:LI t0, 0 # set t0 to 0
accumulate:ADD t0, t0, a0ADDI a1, a1, -1 # decrement a1BGT a1, zero, accumulateMV a0, t0 # copy t0 value to a0RET # return to calling function快速乘法
当乘法在软件中实现时我们上面使用的方法没有被使用因为这太慢了。相反使用了添加和移位的组合。比如执行 42 × 20只需两次加法而不是二十次加法。您可以使用左移 SLL 或 SLLI 以及右移 SRA 和 SRAI。
fast_multiply:ADD t0, zero, zero # to keep track of resultnext_digit:ANDI t1, a1, 1 # is rightmost bit 1?SRAI a1, a1, 1BEQ t1, zero, skip # if right most bit 0, dont addADD t0, t0, a0
skip:SLLI a0, a0, 1 # double first argumentBNE a1, zero, next_digitADD a0, zero, t0 # move accum result to a0HLT参阅一计算思维
参阅二亚图跨际