lh/lb(Load Half / Load Byte)中的符号扩展在哪里?

where does the sign extention happen in lh/lb ( Load Half / Load Byte )?

我研究了一段时间的 mips,关于 ( R-I-J ) 格式以及在处理 I 格式时什么时候需要符号扩展。

但是如果是 lh(Load Half)或 lb(Load Byte),一旦它们从内存中取出,它们的符号就会从 8 bit/16 位扩展到 32 位以避免潜在的错误,但这是什么时候发生的?

立即数在进入ALU之前就进行符号扩展,但是从内存中读取需要的数据后,在保存到寄存器之前需要进行符号扩展。

但是 mips 架构的叠加(单周期)在 WriteBack 阶段没有符号扩展步骤,这是如何工作的?

你不能太认真地对待这些方框图;他们缺少很多真正的处理器必须做的事情。

例如,通常缺少处理 jal 将 PC+4 捕获到 $ra return 地址寄存器的数据路径和控制信号,以及处理 jal 的数据路径和控制信号jr $rareturn调用方操作

通常也有很多缺失。缺少乘法和除法——它们涉及 2 个额外的寄存器以及另一个专门的 ALU(在原始 MIPS 上)。协处理器功能也不存在(协处理器 0 与异常和中断相关,协处理器 1 是浮点单元)。


一种可能性是数据存储器执行 sign/zero 扩展工作,因为它的输出已经是 32 位宽,但是当然,它需要大小信息并知道是零扩展还是符号扩展,并且这些图中未显示的控制信号。

你是对的,它也可能在回写期间发生在寄存器中,但我发现这种情况不太可能 b/c 当我们转向流水线处理器时,有一个从 MEM 阶段输出到 EX 的转发,也从MEM 到 MEM,转发的值需要已经完全形成,所以这不能等到流水线处理器中的 WriteBack。

MIPS 最初是作为流水线处理器而诞生的,那些单周期图基本上是理论上的,用于教育目的。因此,如果他们必须处理它,可能会像在流水线处理器中一样完成,也就是说可能在数据内存块内或紧接在数据内存块之后(并且在内部或之后之间的差异主要是图表和分组的问题按块划分的功能)。

您也正确地指出,指令立即字段在解码期间和到达 ALU 之前进行了符号扩展。需要明确的是,这只是 16 到 32 位扩展,通常只显示为有符号扩展,但必须能够进行符号和零扩展,例如addi 对比 ori。 (指示立即数扩展形式的控制信号通常不会再次显示。)此外,执行立即数扩展的硬件正在使用中,因此不能用于数据存储器输出扩展的扩展,因此字节和半字不在其中已扩展。