lb指令究竟做了什么?

时间:2013-02-12 15:50:41

标签: assembly mips

我的考试即将开始,其中一个练习题是:

  

假设$t0包含值0x12121212$t1包含的值   地址0x1000000

     

假设从地址0x1000000开始的内存数据是:   88 77 66 55

     

执行以下代码后$t0的值是什么:

lb $t0, 0($t1)
     

a)0x00000088 b)0x88121212 c)0xffffff88 d)0x12121288

我给出的答案是a,因为lb指令将读取的字节(通过我对指令操作的理解)是88.然后88将存储在{{1因此,值将为$t0。但给出的答案是0x00000088。我觉得我对c如何运作有一个根本的误解 - 有人可以解释为什么答案是lb吗?

2 个答案:

答案 0 :(得分:4)

答案是c) 0xffffff88lb指令将字节扩展为32位值。即最高有效位(msb)被复制到高24位。

0x88 == 0b10001000,即msb为1.因此高24位将为0b111111111111111111111111 == 0xffffff。

答案 1 :(得分:3)

lb指令从存储器加载一个字节,并将sign extends加载到寄存器的大小。 lbu指令在没有符号扩展名(无符号)的情况下执行相同操作。

http://en.wikipedia.org/wiki/MIPS_architecture#Integer

大多数计算机(包括MIPS)使用two's complement表示签名值,但有other ways to encode the sign,浮点通常以IEEE 754格式表示,使用带符号的幅度。整数有符号值可以用任意数量的位表示,例如

  • C中的char是8位,可以表示-128到+127
  • C中的short是16位,可以表示-32768到+32767

在二进制补码中,最重要的位可用于确定数字的符号,'1'表示它是负数,而'0'表示它是正数。

数字0x88,当被解释为8位二进制补码数时,为负0x78或-120十进制。当以32位二进制补码表示时,这是0xFFFFFF88。有几种方法可以记住如何计算数字的二进制补码:

  • 取一个数字的补码(反转每一位)并加上'1'或
  • 从最低位到最高位(从右到左),跳过每个'0'和你遇到的第一个'1',之后反转每一位

要将8位扩展到32位,只需查看最高有效位(第7位)并将该位复制到第8位至第31位......这取决于二进制补码的定义。