4

我要考试了,其中一个练习题是:

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

假设内存数据,起始地址0x1000000为: 88 77 66 55

$t0执行以下代码后的值是多少:

lb $t0, 0($t1)

a) 0x00000088b) 0x88121212c) 0xffffff88d)0x12121288

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

4

2 回答 2

8

The answer would be c) 0xffffff88. The lb instructions sign-extends the byte into a 32-bit value. I.e. the most significant bit (msb) is copied into the upper 24 bits.

0x88 == 0b10001000, i.e. the msb is 1. So the upper 24 bits will be 0b111111111111111111111111 == 0xffffff.

于 2013-02-12T16:00:26.193 回答
5

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

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

大多数计算机(包括 MIPS)都使用二进制补码来表示有符号值,尽管还有其他方法可以对符号进行编码,浮点通常以使用有符号幅度的IEEE 754格式表示。整数有符号值可以用任意位数表示,例如

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

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

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

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

要将 8 位符号扩展为 32 位,只需查看最高有效位(第 7 位)并将该位复制到第 8 位到第 31 位……这遵循二进制补码的定义。

于 2013-02-12T15:56:00.033 回答