MIPS 中的加载字节指令
load byte instruction in MIPS
我正在通过 MIPS 指令学习计算机体系结构。我有一个问题是:
0x10000000 处的内存包含 0x80
寄存器 $5 包含 0x10000000
执行 lb $8,0($5) 后寄存器 $8 中放了什么?
我在想调用加载字节时,它会从0x10000000地址中取出0x80[10000000]的8位,并将其加载到$8寄存器的前8位,并用零填充其余位使得答案是 00000080。但列出的正确答案是 FFFFFF80。我不确定我是否理解它。谁能帮忙解释一下?
你在这里提到的指令是lb
,它通过将字节符号扩展到字大小来将一个字节加载到寄存器中。这意味着如果最高有效位设置为 1,它将用 1 填充剩余的 24 位。这样做是为了在 32 位表示中保留字节的二进制补码值。
如果您的字节是 0100 1010
符号扩展将用 0
填充它作为
0000 000... 0100 1010
.
如果您的字节是 1011 0101
符号扩展将用 1
填充它作为
1111 111... 1011 0101
.
为避免这种情况并始终用 0
填充字节,您可以使用替代 lbu
指令,该指令不执行符号扩展,而是用 0
填充字节。
这保留了字节的 unsigned 值,因为那些不涉及二进制补码。
我正在通过 MIPS 指令学习计算机体系结构。我有一个问题是:
0x10000000 处的内存包含 0x80 寄存器 $5 包含 0x10000000 执行 lb $8,0($5) 后寄存器 $8 中放了什么?
我在想调用加载字节时,它会从0x10000000地址中取出0x80[10000000]的8位,并将其加载到$8寄存器的前8位,并用零填充其余位使得答案是 00000080。但列出的正确答案是 FFFFFF80。我不确定我是否理解它。谁能帮忙解释一下?
你在这里提到的指令是lb
,它通过将字节符号扩展到字大小来将一个字节加载到寄存器中。这意味着如果最高有效位设置为 1,它将用 1 填充剩余的 24 位。这样做是为了在 32 位表示中保留字节的二进制补码值。
如果您的字节是 0100 1010
符号扩展将用 0
填充它作为
0000 000... 0100 1010
.
如果您的字节是 1011 0101
符号扩展将用 1
填充它作为
1111 111... 1011 0101
.
为避免这种情况并始终用 0
填充字节,您可以使用替代 lbu
指令,该指令不执行符号扩展,而是用 0
填充字节。
这保留了字节的 unsigned 值,因为那些不涉及二进制补码。