2017-01-31 1 views
0

내 MIPS 코드에 문제가 있습니다 ... 비교할 문자없이 키보드로 전달 된 문자열의 발생을 확인합니다. 스택에 문자열 (스택 -255 위치)과 .data 섹션에 배열을 저장하여 발생을 저장합니다. 기본 개념은 스택에서 문자 하나 하나를 루프 (lb $ t1, ($ a0) t1 = 문자의 아스키 코드 - a0 = 함수에서 전달 된 스택)로로드하고, 읽은 문자를 뺍니다 97 (97 = a)를 스택에서 가져 와서 배열의 인덱스를 얻고 다른 루프를 사용하여 발생 횟수를 계산하고 이전에 계산 된 인덱스로 저장하십시오. 당연히 어레이에는 104 개의 위치가 있습니다 (26 개의 문자 * 4는 발생 횟수를 저장하기 때문에). 문제는 내 배열 위치의 인덱스를 찾을 때 sw $ -, myArray ($ -) Mars를 사용하여 발생 위치를 저장한다는 것입니다.Runtime exception at 0x0040007c : 저장소 주소가 정렬되지 않았습니다. 단어 경계에 0x10010087 .. 데이터 섹션에서 .align을 추가하려고했지만 솔루션을 찾지 못했을 수 있습니다. 메모리에 단어를 액세스하려면, 주소가 워드로 정렬 (4의 배수)해야합니다왜 "저장 주소가 단어 경계에 정렬되지 않았습니다"

analizza_stringa: (function) 

while_string: 

# load a byte from the stack 
lb $t0, ($a0) 

#check end string 
beq $t0, $zero, end 

#check a line feed 
beq $t0, 10, end 

    #array index 
    subi $t3, $t0, 97 

    #Multiply by 4 (I would save number) 
    mul $t4, $t3, 4 

    while_occorrenza: 
     #like before 
     beq $t1, 10, continue 

     #load a letter like before 
     lb $t1,($a0) 

     #Check the occurrences 
     bne $t1, $t0, continue2 

     #add 1 at the occurrences 
     addi $t5, $t5, 1 

     continue2: 

     #add 1 for the pointer at the string 
     addi $a0, $a0, 1 

     #Repeat 
     j while_occorrenza 

    continue: 

    #Save the number under the index calculated before 
    sw $t5, myArray($t4) 

    #counter=0 for another loop 
    li $t3, 0 

#next character 
addi $a0, $a0, 1 

# repeat the first loop 
j while_string 

end: 
jr $ra 

답변

0

:

내 코드입니다.

$t4에 4의 배수가 포함되어 있다고 가정하면 myArray은 단어 정렬되지 않음을 의미합니다. 이 문제를 해결하려면 데이터 섹션에 myArray 앞에 줄에 .align 2을 추가하십시오.

+0

대단히 감사합니다. Michael !!! 이제 배열 내에서 내 발생을 저장할 수 있습니다. 감사합니다 감사합니다! – Marco

관련 문제