Markus helbæk Asked: 2023-11-30 21:06:53 +0800 CST2023-11-30 21:06:53 +0800 CST 2023-11-30 21:06:53 +0800 CST RISC-V架构,为什么无分支时加4字节,分支时移位1字节? 772 如果我理解正确的话,当您增加程序计数器(PC)时,它需要增加四个字节,因为所有指令都是 32 位,对吗? 让我困惑的是,我认为“左移 1”操作需要是“左移 2”。然后我意识到 RISC-V ISA 有一个支持 16 位指令的扩展。在这种情况下,将立即值乘以二(“左移 1”)是有意义的。然而,现在将 PC 增加四个字节似乎不合逻辑。 我不明白,汇编器会自动处理这个吗?如果是这样怎么办?我附上了RISC-V架构供参考。 assembly 2 个回答 Voted Best Answer Erik Eidt 2023-12-01T01:27:06+08:002023-12-01T01:27:06+08:00 为什么在没有分支的情况下添加 4 个字节,而在分支时则移一位? 简单的答案是 ISA 就是这样定义事物的;然而,其动机是让所有 RISC V 指令集与可变大小指令功能兼容。 RISC V 的编码允许 32 位、16 位以及以 16 位为增量的更大位。因此,分支偏移量被编码为 × 2(而不是像 MIPS 上那样编码为 × 4,MIPS 也有 4 字节指令)。 虽然这意味着分支指令的范围/到达范围减少(对于仅支持 32 位指令的处理器没有任何好处),但其优势在于工具和二进制机器代码与支持超过 32 位指令大小的处理器的兼容性。 目前,只有一种非 32 位规范,RVC,又名压缩指令集配置文件,它定义 16 位指令,并且可以添加到基础 RV32 或 RV64,这意味着此类处理器同时具有 32 位和 16 位指令。位指令。 仅供参考,在我看来,RVC 似乎很受欢迎;像 GCC 这样的编译器(Godbolt上的示例)默认以支持它们的 RISC-V 为目标。但对于第一次了解 CPU 内部结构的学生来说,越简单越好,只保留 CPU 所需的复杂性,然后对其进行流水线处理。 Markus helbæk 2023-11-30T21:46:17+08:002023-11-30T21:46:17+08:00 好吧,我想我明白了。感谢@Jester。 指令为4字节:在RISC-V架构中,每条指令占用4字节内存。 PC 增加 4 以到达下一条指令:程序计数器 (PC) 跟踪要获取的下一条指令的内存地址。由于每条指令都是 4 个字节,因此将 PC 加 4 将其移动到下一条指令的地址。 B类指令编码的偏移量以2字节为单位:B类指令经常涉及分支,这些指令中的偏移量字段以2字节(16位)为单位编码。这意味着偏移量指定一定数量的 2 字节增量。 移位1:由于偏移量以2字节为单位,因此在计算目标地址时需要左移1(乘以2)。此调整将偏移量与 4 字节指令大小对齐,确保分支发生在正确的地址处。 @Jester,你同意吗?感谢@Jester 的帮助!:)
简单的答案是 ISA 就是这样定义事物的;然而,其动机是让所有 RISC V 指令集与可变大小指令功能兼容。
RISC V 的编码允许 32 位、16 位以及以 16 位为增量的更大位。因此,分支偏移量被编码为 × 2(而不是像 MIPS 上那样编码为 × 4,MIPS 也有 4 字节指令)。
虽然这意味着分支指令的范围/到达范围减少(对于仅支持 32 位指令的处理器没有任何好处),但其优势在于工具和二进制机器代码与支持超过 32 位指令大小的处理器的兼容性。
目前,只有一种非 32 位规范,RVC,又名压缩指令集配置文件,它定义 16 位指令,并且可以添加到基础 RV32 或 RV64,这意味着此类处理器同时具有 32 位和 16 位指令。位指令。
仅供参考,在我看来,RVC 似乎很受欢迎;像 GCC 这样的编译器(Godbolt上的示例)默认以支持它们的 RISC-V 为目标。但对于第一次了解 CPU 内部结构的学生来说,越简单越好,只保留 CPU 所需的复杂性,然后对其进行流水线处理。
好吧,我想我明白了。感谢@Jester。
指令为4字节:在RISC-V架构中,每条指令占用4字节内存。
PC 增加 4 以到达下一条指令:程序计数器 (PC) 跟踪要获取的下一条指令的内存地址。由于每条指令都是 4 个字节,因此将 PC 加 4 将其移动到下一条指令的地址。
B类指令编码的偏移量以2字节为单位:B类指令经常涉及分支,这些指令中的偏移量字段以2字节(16位)为单位编码。这意味着偏移量指定一定数量的 2 字节增量。
移位1:由于偏移量以2字节为单位,因此在计算目标地址时需要左移1(乘以2)。此调整将偏移量与 4 字节指令大小对齐,确保分支发生在正确的地址处。
@Jester,你同意吗?感谢@Jester 的帮助!:)