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