2017-11-09 30 views
0

주소를 인쇄 할 때 몇 시간을 보냈지 만 알아낼 수 없습니다. 이것은 QTSpim을 통해 실행되는 간단한 어셈블리 프로그램입니다. 프로그램은 크기가 20 인 배열에 대해 값을 취하고 배열에서 두 개의 가장 작은 정수를 찾은 다음 배열을 추가 한 다음 main에 반환하여 배열 바로 다음 위치의 메모리에 저장합니다.MIPS 데이터/스택 읽기의 주소가 잘못되었습니다.

프로그램은 배열에 대해 20 개의 값을 취하지 만, 데이터/스택 읽기의 잘못된 주소 인 0x10040000을 계산하여 뱉어냅니다. 내 모든 다른 데이터는 0x100100XX 메모리 위치에 있으며, 왜 40000이오고 있는지 알 수 없습니다.

.data 
Fresh: .space 80 
freshSmallestSum: space 4 

.text 
sumMin: 
    lw  $t2, 0($a0) # $t2 = smallest array[i] 
    addi $t4, $t0, 1 # $t4 = i + 1 
    sll  $t4, $t4, 2 # $t4 = i * (2^2) 
    add  $t4, $t4, $a0 # $t4 = absolute address array[i+1] 
    lw  $t3, 0($t4) # $t3 = array[i+1] 
    li  $t4, 2  # i = 2 
    ble  $t2, $t3, loopSmall # if $t2 <= t3 jump 
    move $t9, $t2 
    move $t2, $t3 
    move $t3, $t9 
loopSmall: 
    bge  $t4, $t1, ret1 
    sll  $t5, $t4, 2 # $t5 = i * (2^2) 
    add  $t5, $t5, $a0 # absolute address array[i] 
    lw  $t5, 0($t5) # $t5 = array[i] 
    ble  $t3, $t5, next2 # if $t3 <= array[i], jump 
    move $t3, $t5 # else $t3 = array[i] 
    ble  $t2, $t3, next2 # if $t2 <= $t3, jump 
    move $t9, $t2 # else swap two smallest 
    move $t2, $t3 
    move $t3, $t9 
next2: 
    addi $t4, $t4, 1 # i++ 
    j loopSmall 
ret1: 
    add  $v0, $t2, $t3 # $v0 = smallest + secondSmallest 
    jr  $ra 

.text 
.globl main 
main: 
    li  $t3, 0 
    li  $t0, 0  # i = 0 
    li  $t1, 20  # $t1 = 20 
    la  $s2, Fresh 

inLoop: 
    bge $t3, $t1, next # If $t3 > array length, jump 
    sll  $t2, $t3, 2 
    add  $t4, $t2, $s2 # Absolute address of fresh 
    li  $v0, 5 
    syscall 
    sw  $v0, 0($t4) 
    addi $t3, $t3, 1 # Increment counter 
    j  inLoop  
move  $a0, $s2 # $a0 = address Fresh 
    jal  sumMax  # Get max sum of Fresh 
    la  $t1, freshLargestSum 
    sw  $v0, 0($t1) # Store sum in freshLargestSum 

    move $a0, $s2 
    jal  sumMin  # Get min sum of Fresh 
    la  $t1, freshSmallestSum 
    sw  $v0, 0($t1) # Store sum in freshSmallestSum 

exit:  li $v0, 10 
    syscall 
+0

시뮬레이터를 사용하여 코드를 단계별로 실행하고 오류가있는 명령을 확인하십시오. 그런 다음 레지스터 값을 확인하고 잘못된 점을 확인한 다음 역으로 작업하여 나쁜 값을 얻었는지 확인합니다. 추신 : 나는 '다음'이라는 라벨을 찾을 수 없으며, 복사 - 붙여 넣기 오류가 있거나 정말로 갖고 있지 않습니까? 또한,'sumMin'은'$ t1'에서 배열 크기를 예상하는 것 같지만 그 시점에서'freshLargestSum'의 주소를 포함합니다. – Jester

+0

죄송합니다 - 분명히 복사 붙여 넣기 오류가 발생했습니다 - 프로그램이이 코드 세그먼트보다 훨씬 오래되었습니다. 관련 조각 만 자르려고합니다. 그리고 $ t1은 오류였습니다! 정말 고마워요. 작은 레지스터 변경이 sumMin 코드의 코드에서 가까와서 나는 그것을 잡지 못했습니다. 귀하의 의견에 의해 고정 된 미래의 응시 시간, 감사합니다! – Tenze

+0

특히 초보자 인 경우 디버그 도움말을 위해 실제로 게시하는 코드를 테스트해야합니다. –

답변

1

대부분의 코드는 훌륭하게 보이지만 전체 파일이 아닙니다.

sumMin 함수가 배열 크기를 t1로 원하지만 newLargestSum 주소를 제공하고있는 것 같습니다.

코드를 한 줄씩 살펴 보았습니까? 특히 MIPS에서 대부분의 오류는 일반적으로 나중에 코드에서 필요로하는 덮어 쓰기 레지스터입니다. 특히 우리가 뛰어 내릴 때.

좋은 디버깅 기술은 함수가 모두 독립적으로 예상대로 작동하는지 테스트하는 것입니다. 그렇다면 오류가 주 코드에 있다는 것을 알고 있습니다. 와 함께 할 가능성이 높습니다 :

  • 덮어 쓰기 레지스터 잘못된 장소
  • 덮어 쓰기에
  • JAL은 반환 희망이 당신의 문제를 해결하는 데 도움이
  • 잘못된 논리를

등록!