在RISC MIPS指令集中,我们有加载字节(lbu
),加载半字(lhu
)和加载字(lw
)指令。在我看来,使用lbu
可以实现lhu
和lw
所能做的一切。
那么为什么MIPS设计师会介绍lbu
和lhu
?在什么情况下(最好是非模糊的)它们可能有用吗?也许lw
需要比lbu
更长的时间来执行,即使两者都是单指令?
答案 0 :(得分:6)
lw
要求您加载的地址是字对齐的(即地址必须是4的倍数)。
所以,让我们说你有这个数组位于地址0x1000:
array: .byte 0,1,2,3
并且您想要加载第二个字节(1
),它位于地址0x1001,不是字对齐的。这显然不会起作用,除非你从地址0x1000做了一个lw
,然后进行了一些移位和ANDing以得到你想要的字节,这对于程序员来说真的很麻烦。
或者让我们假设您要加载0
, 位于字对齐的地址,并将其与某个值进行比较。因此,您从地址0x1000开始lw
,但现在您的目标寄存器将包含0x00010203
或0x03020100
(取决于字节顺序),而不仅仅是0
。因此,在执行比较之前,您必须按位进行AND以提取所需的字节。
我确信您可以看到,只要您想处理单个字节的数据,就必须执行这些额外的步骤会非常不方便 - 在大多数程序中这是非常常见的操作。