【问题标题】:Unable to convert RISC-V to Machine code -- difficulty with handling immediate value无法将 RISC-V 转换为机器码——难以处理即时值
【发布时间】:2019-10-05 04:35:13
【问题描述】:

我需要将以下每个 RISC-V 指令转换为机器码。

将答案格式化为 32 位十六进制数,例如0xABADCAFE 或 0xabadcafe(这家咖啡馆很糟糕)。将任何未使用的位保留为 0。

Refer to this sheet 如果需要。

第一季度。 jal ra, fib

假设 PC=0x00400014,fib 位于 0x00400028。

第二季度。 beq t3, t5, NEXT

假设 PC=0x0040011C,NEXT 位于 0x0040010C。

【问题讨论】:

    标签: riscv


    【解决方案1】:

    jal 指令的立即数与程序计数器 (pc) 相关。所以指令中编码的立即数是0x00400028 - 0x00400014 = 0x14 = 0b10100。查看备忘单,我们可以看到指令中位的编码顺序:[20|10:1|11|19:12](位 0 未编码,因为所有指令都以偶数字节编码)。插入所有内容,我们可以看到立即数被编码为0|0000001010|0|00000000。将寄存器ra(x1)和操作码(1101111)相加得到二进制数0|0000001010|0|00000000|00001|1101111,即十六进制0x014000EF

    beq 指令的方法相同。这里的区别在于跳转到的指令在分支指令之前(immediate = 0x0040010C - 0x0040011C = -0x10)。 Risc-V 将立即数解释为two's complement 中的有符号数。因为立即数的大小是 12 位,所以它的编码是:-0x10 = 0b1111'1111'0000。将它们加在一起会导致:1|111111|11110|11100|000|1000|1|1100011 = 0xFFEE08E3

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 2017-01-18
      • 1970-01-01
      • 2017-08-22
      • 2020-01-12
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多