我要考试了,其中一个练习题是:
假设
$t0包含 value0x12121212和$t1address0x1000000。假设从地址开始的内存数据
0x1000000是:88 77 66 55。
$t0执行以下代码后的值是什么:Run Code Online (Sandbox Code Playgroud)lb $t0, 0($t1)a)
0x00000088b)0x88121212c)0xffffff88d)0x12121288
我给出的答案是a,因为lb指令将读取的字节(根据我对指令的理解)是 88。然后 88 将被存储在 中$t0,因此值将是0x00000088。但给出的答案是c。我觉得我对lb工作原理有一个根本的误解- 有人可以解释为什么答案c吗?
该lb指令从内存加载一个字节并sign extends加载到寄存器的大小。该lbu指令执行相同的操作,但不带符号扩展(无符号)。
http://en.wikipedia.org/wiki/MIPS_architecture#Integer
大多数计算机(包括 MIPS)使用二进制补码来表示有符号值,尽管还有其他方法对符号进行编码,浮点通常以使用有符号大小的IEEE 754格式表示。整数有符号值可以用任意位数表示,例如
char是8位,可以表示-128到+127short是16位,可以表示-32768到+32767在二进制补码中,最高有效位可用于确定数字的符号,a'1'表示负数,a'0'表示正数。
当数字 0x88 被解释为 8 位二进制补码数时,它是负数 0x78 或十进制 -120。当以 32 位二进制补码表示时,为 0xFFFFFF88。有几种方法可以记住如何计算数字的补码:
要将 8 位符号扩展为 32 位,只需查看最高有效位(第 7 位)并将该位复制到第 8 位到第 31 位...这来自二进制补码的定义。
答案是c) 0xffffff88。所述lb指令登录延伸字节成32位值。即最高有效位 (msb) 被复制到高 24 位。
0x88 == 0b10001000,即 msb 为 1。所以高 24 位将是 0b111111111111111111111111 == 0xffffff。
| 归档时间: |
|
| 查看次数: |
35163 次 |
| 最近记录: |