assembly RISC-V架构,为什么一个没有分支的4个字节增加,但当分支时用1个字节移位?

pes8fvy9  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(87)

如果我理解正确的话,当你增加程序计数器(PC)时,它需要增加4个字节,因为所有的指令都是32位的,对吗?
令我困惑的是,我认为“左移1”操作需要是“左移2”。然后我意识到RISC-V伊萨有一个支持16位指令的扩展。在这种情况下,将立即值乘以2(“左移1”)是有意义的。然而,现在将PC增加4个字节似乎不符合逻辑。
我不明白,汇编器会自动处理这个吗?如果是的话,怎么处理?我附上了RISC-V架构供参考。
x1c 0d1x的数据

pkmbmrz7

pkmbmrz71#

为什么在没有分支的情况下添加4个字节,但在分支时移位1个字节?
简单的回答是,这是伊萨定义的方式;然而,动机是所有RISC V指令集都与可变大小的指令功能兼容。
RISC V的编码允许32位、16位以及以16位为增量的更大值。因此,分支偏移量被编码为× 2(而不是MIPS上的× 4,MIPS也有4字节指令)。
虽然这意味着分支指令的范围/到达被减小(在仅支持32位指令的处理器上没有益处),但是优点在于工具和二进制机器码与支持超过32位的指令大小的处理器的兼容性。
目前,只有一个非32位规范,RVC,又名压缩指令集配置文件,它定义了16位指令,可以添加到基础RV 32或RV 64,这意味着这样的处理器有32位和16位指令。
顺便说一句,RVC似乎很受欢迎,在我看来;像GCC这样的编译器(Godbolt上的例子)默认针对支持它们的RISC-V。但是对于第一次看到CPU内部的学生来说,简单是更好的,只保留CPU所需的复杂性,然后将其流水线化。

qxgroojn

qxgroojn2#

好吧,我想我明白了。谢谢@杰斯特。
指令是4字节:在RISC-V架构中,每条指令占用4字节的内存。
PC增加4以到达下一条指令:程序计数器(PC)跟踪下一条要提取的指令的内存地址。由于每条指令是4字节,因此PC增加4将其移动到下一条指令的地址。
B类指令中的偏移量以2字节为单位编码:B类指令通常涉及分支,这些指令中的偏移量字段以2字节(16位)为单位编码,这意味着偏移量指定了一定数量的2字节增量。
移位是1:由于偏移量是以2字节为单位的,因此在计算目标地址时需要将其左移1(乘以2)。此调整将偏移量与4字节指令大小对齐,以确保分支发生在正确的地址。
@杰斯特,你赞成吗?谢谢@杰斯特的帮助!:)

相关问题