亲爱的RISCV爱好者,
我的问题是关于编码的
li t1, 0xFF00F007
使用时 https://riscvasm.lucasteske.dev/# 上面的代码编码为
0: 000ff337 lui t1,0xff
4: 00f3031b addiw t1,t1,15
8: 00c31313 slli t1,t1,0xc
c: 00730313 addi t1,t1,7 # ff007 <_sstack+0xee607>
在我天真的尝试对指令进行编码时,我想出了
[0] lui sp, 0xFF00F # --pseudo--> I_LI -> FF00F137
[4] addiw t1, sp, 0x7 # --pseudo--> I_LI -> 0071031B
我一定错过了什么。
我的问题是:
1.我自己的尝试正确吗?
2. 如果是正确的,为什么会https://riscvasm.lucasteske.dev/#
输出 4 条指令而不是 2 条?看来 4 条指令的性能不如 2 条。
感谢您的意见。
我在 RISCV 解释器中尝试了自己的代码https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/ 似乎正确的立即数最终出现在寄存器中。
所以我没有看到我做错了什么。
问题是 0xFF00F007 是否应该被视为已签名。
他们的序列将 0x00000000FF00F007 加载到
t1
,而你的序列加载 0xFFFFFFFFFF00F007。
原因是在 64 位机器上,
lui
符号会扩展。