2016-12-11 3 views
0
[00400028] 8d090008 lw $9, 8($8); lw $t1, 0x008($t0) 

[0040002c] 312a0002 andi $10, $9, 2   ; 5: andi $t2,$t1,0x2 

[00400030] 1148fffd beq $10, $8, -12 [chkswitch-0x00400030] 

[00400034] 3c010001 lui $1, 1    ; 7: lw $t3,0x8000($t0) 

[00400038] 00280821 addu $1, $1, $8   

[0040003c] 8c2b8000 lw $11, -32768($1) 

[00400040] 3c010001 lui $1, 1    ; 9: lw $t1, 0x8008($t0) 

[00400044] 00280821 addu $1, $1, $8   

[00400048] 8c298008 lw $9, -32760($1) 

Comme indiqué ci-dessus, l'instruction lw a été traduit en 3 code machine lorsque j'utilise 0x8000, pourquoiquelque chose branché sur l'enseignement pv lorsque j'utilise QtSpim

Répondre

1

Cela serait-il? Il semble le résultat est faux. Parce que le décalage pour lw est une valeur signée de 16 bits, ce qui signifie que seulement -32768 .. + 32767 (-0x8000 .. + 0x7FFF) peut être représenté.

L'assembleur est « fixer » pour vous en convertissant votre instruction invalide en trois: les valides

lui $1, 1    # $at = 0x10000 
addu $1, $1, $8   # $at += $t0 
lw $11, -32768($1)  # $t3 = -32768($at) (== 32768($t0))