2012-03-01 68 views
0

我正在审查一个测试,我无法弄清楚为什么这个答案是0x605040c而不是12,或为一个后,为什么它是而不是123.为什么值被存储在寄存器0x605040c,而不是12?

感谢您的帮助,代码在下面。我在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= 0x
lw $a1, 0($t3) #$a1= 0x1 
sll $a1,$a1,3 #$a1= 0x8 

回答

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) 

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

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

^这意味着负载立即16位常数到高16位,使低16位全零。 (参见the reference,跳过了LUI)

+0

天上!我知道了! – Lucas 2012-03-01 05:08:00

+0

请记住投票并接受,谢谢。 – Nayuki 2012-03-01 05:10:48

相关问题