我正在通过 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
填充字节的指令反而。
这保留了字节的无符号值,因为这些值不涉及二进制补码。
关于mips - MIPS 中的加载字节指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55015738/