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