2016-12-11 10 views
0
위 도시 된 바와 같이, lw 명령은 3 기계 코드로 번역
[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) 

내가 0x8000를 사용할 때, 왜 이런 일이 일어날 사용할 때 LW 명령에 대해 유? 결과가 잘못된 것 같습니다.뭔가 내가 QtSpim가

답변

1

때문에 lw의 오프셋은 부호있는 16 비트 값이므로 -32768 .. + 32767 (-0x8000 .. + 0x7FFF) 만 나타낼 수 있습니다.

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

어셈블러는이 세 가지 유효한 것들로 잘못된 명령을 변환하여 "고정"입니다