Почему значение хранится в регистре 0x605040c, а не 12? - PullRequest
0 голосов
/ 01 марта 2012

Я проверяю тест и не могу понять, почему ответом является 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 Ответ

2 голосов
/ 01 марта 2012

Ответ на ваши вопросы обычно можно получить, прочитав справочный документ о каждой используемой вами инструкции 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= 0x01230000

^ Это означает, что загружает непосредственную 16-битную константу в старшие 16 бит и делает нижние 16 битов равными 0 (См. ссылка , перейдите к LUI.)

...