RISC-V 对 PC 溢出有何作用?

Ale*_*kin 3 cpu assembly specifications program-counter riscv

当程序计数器 (PC) 溢出时,RISC-V CPU 上会发生什么?

\n

例如,执行 0xFFFF\xe2\x80\x99FFFC 处的(32 位)NOP 后,RV32G IALIGN\xc2\xa0= 32 上会发生什么?或者在 RV32GC 上执行 0xFFFF\xe2\x80\x99FFFE 处的 16 位 NOP 后?这两个问题的最简单答案是 \xe2\x80\x9c 没什么,执行从 0x0000\xe2\x80\x990000\xe2\x80\x9d 开始,但是在 0xFFFF\ 处执行 16 位 NOP 后 RV32GC 上会发生什么xe2\x80\x99FFFC 已被执行?同样的答案意味着指令获取可能需要跨越地址空间的末尾,这在架构上听起来并不令人愉快。(话又说回来,对于 IALIGN\xc2\xa0= 16,指令获取可能必须跨越页面边界,这听起来也不那么令人愉快,而且 IIRC x86 实现已经为部分故障引起了很多欢闹。指令获取。)

\n

最好参考规范PDF ,尽管我还没有\xe2\x80\x99t 能够在那里找到任何相关内容。如果做不到这一点,\xe2\x80\x99d 听听实际的硬件实现在这种情况下会做什么会很有趣。

\n

Eri*_*idt 5

https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf

\n
\n
\n

1.4 内存

\n

RISC-V hart 具有 2 XLEN字节的单字节可寻址地址空间,用于所有内存访问。\n内存定义为 32 位(4 字节)。相应地,半字为16位(2字节),双字为64位(8字节),四字为128位(16字节)。内存地址空间是循环的,因此地址 2 XLEN \xe2\x88\x921 处的字节与地址 0 处的字节相邻。因此,硬件完成的内存地址计算会忽略溢出,而是以 2 XLEN为模进行回绕。

\n
\n
\n

这对我来说表明 PC 回绕,因为递增它是内存地址计算。

\n

  • @puppydrum64,这当然是可能的;需要指出的是,导致故障的不是包装本身,而是包装之后可能发生的情况。我假设OP正在编写或研究硬件或软件模拟器,并且想知道如何实现这似乎是一个极端的情况,更多的是抽象的,而不是实际想要在某些程序中部署使用最后一个地址。 (2认同)