2014-09-05 1 views
0

안녕하세요 MIPS 어셈블리 언어를 처음 사용하고 B[8]=A[i-j]에 해당하는 변수를 쓰려고 시도하는 중, 변수 f, g, h, i 및 j가 $ s0, $ s1, $ s2, $ s3 및 $ s4에 각각 적용됩니다. 배열 A와 B의 기본 주소는 각각 레지스터 $ s6과 $ s7에 있다고 가정합니다.mips 주소 범위를 벗어났습니다

내 코드

# Gets A[i-j] 
sub $t1, $s3, $s4 
sll $t1, $t1, 2 
add $t1, $s6, $t1 

lw $t0, 0($t1) 

# Set B[8] equal to above 
addi $t2, $s0, 8 
sll $t2, $t2, 2 
add $t2, $s7, $t2 

lw $t2, 0($t2) 
sw $t2, 0($t0) 

하지만이 0x0040000c에서 런타임 예외가 발생합니다 : 주소 범위를 0x00000000에서, 어떤 조언을? 당신은 당신의 코드가 설명을 일치 시키려면

+0

화재까지 디버거와는 다음과 같은 답 : 어떤 명령은 주소 0x0040000c에있다? 그 당시에는 레지스터에는 무엇이 들어 있었으며, 어떻게 그것을 포함 할 수 있었습니까? – moonshadow

+0

'$ s6'이 실제로 유효한 주소를 포함하고 있는지 확인 했습니까? 그리고'$ s3'과'$ s4'에 어떤 가치가 있습니까? – Michael

답변

2
# Gets A[i-j] 
sub $t1, $s3, $s4 
sll $t1, $t1, 2 
add $t1, $s6, $t1 

lw $t0, 0($t1) 

# Set B[8] equal to above 
addi $t2, $s0, 8    #this actually computes something like &B[f+8], not &B[8] 
sll $t2, $t2, 2 
add $t2, $s7, $t2 

lw $t2, 0($t2)    #this loads the value B[f+8] 
sw $t2, 0($t0)    #this stores B[f+8] to *(int *)A[i-j], which is probably not an address. 

, 당신은에 있습니다

# Gets A[i-j] 
sub $t1, $s3, $s4 
sll $t1, $t1, 2 
add $t1, $s6, $t1 

lw $t0, 0($t1) 

# Set B[8] equal to above 
addi $t2, $zero, 8 
sll $t2, $t2, 2 
add $t2, $s7, $t2 

##deleted##lw $t2, 0($t2) no need to load B[8] if you just want to write to it 
sw $t0, 0($t2) #this stores A[i-j] to &B[8]