为什么值存储在寄存器0x605040c中,而不是12?

时间:2012-03-01 04:11:10

标签: assembly mips

我正在审查一个测试,我无法弄清楚为什么这个答案是0x605040c而不是12,或者之后的那个,为什么它是0123000而不是123.

感谢您的帮助,代码如下。我在QtSPIM中运行它,我仍然无法弄清楚它!

data
var1:  .byte 12
var2:  .byte 4,5,6
var3:  .word 1,2,3,4,5,6,7,8,9
  .globl main
.text
main:
la $t1, var1
la $t2, var2
la $t3, var3
lb $a1,1($t2) #$a1= 0x5
lw $a1, 0($t1) #$a1= 0x605040c
lui $a1,0x123 #$a1= 0x01230000
lw $a1, 0($t3) #$a1= 0x1
sll $a1,$a1,3 #$a1= 0x8

1 个答案:

答案 0 :(得分:2)

通常可以通过阅读reference document关于您使用的每个MIPS指令来回答您的问题。

我假设你的MIPS机器是little-endian

首先,让我们看看你的记忆:

Address:      0     1  2  3   4  5  6  7   8  9  10 11  12 13 14 15 ... 36 37 38 39
Value (hex):  0C    04 05 06  01 00 00 00  02 00 00 00  03 00 00 00 ... 09 00 00 00
Label:        ^var1 ^var2     ^var3

现在我们将分析代码中棘手的部分:

lw $a1, 0($t1)

^这意味着加载从地址t1开始的32位(4字节)字,以小端。 t1 = var1时,4个字节为0C 04 05 06. 32位整数的解释为0605040C。

lui $a1,0x123 #$a1= 0x01230000

^这意味着将立即的16位常量加载到高16位,并使低16位全部为零。 (请参阅the reference,跳至LUI。)