MIPS:为什么我们已经有加载字时还需要加载字节?

MIPS: Why do we need load byte when we already have load word?

在RISC MIPS指令集中,我们有加载字节(lbu)、加载半字(lhu)和加载字(lw)指令。在我看来,lbulhu 可以做的一切都可以用 lw 来实现。

那么为什么 MIPS 设计者要引入 lbulhu?在什么情况下(最好是非模糊的)它们可能有用?也许 lwlbu 执行时间更长,即使两者都是单指令?

lw 要求您加载的地址是字对齐的(即地址必须是 4 的倍数)。

所以假设你有这个数组位于地址 0x1000:

array: .byte 0,1,2,3

并且您想加载第二个字节 (1),它位于地址 0x1001,不是字对齐的。这显然行不通,除非您从地址 0x1000 执行 lw 然后执行一些移位和 ANDing 以获得您想要的字节,这对程序员来说是一个真正的麻烦。

或者假设您想要加载 0,其中 位于字对齐地址,并将其与某个值进行比较。因此,您从地址 0x1000 执行 lw,但现在您的目标寄存器将包含 0x000102030x03020100(取决于字节序),而不仅仅是 0。因此,在执行比较之前,您必须按位执行 AND 以提取您想要的字节。

我相信您会看到,无论何时您想要处理单个字节的数据,都必须执行这些额外的步骤是非常不方便的 - 这在大多数程序中是非常常见的操作。