2011-10-19 2 views
1

프로그램과 함께 예상되는 출력을하지만가 무슨 잘못이 MIPS/QtSPIM While 루프 코드

코드

.data 

.text 
.globl main 
main: 
    addi $t0, $t0, 0 # i = 0 
    addi $t2, $0, 10 # n = 10 
    j WhileCond   # goto WhileCond 

    WhileLoop: 
    li $v0, 1   # print_int 
    move $a0, $t0  # $a0 = i (print i) 
    addi $t0, $t0, 1 
    syscall 

    WhileCond: 
    blt $t0, $t2, WhileLoop # if i < 10 goto WhileLoop 

    j $ra 

사용자 텍스트 세그먼트

[00400000] 21080000 addi $8, $8, 0   ; 10: addi $t0, $t0, 0 # i = 0 
[00400004] 200a000a addi $10, $0, 10   ; 11: addi $t2, $0, 10 # n = 10 
[00400008] 08100007 j 0x0040001c [WhileCond] ; 12: j WhileCond # goto WhileCond 
[0040000c] 34020001 ori $2, $0, 1   ; 15: li $v0, 1 # print_int 
[00400010] 00082021 addu $4, $0, $8   ; 16: move $a0, $t0 # $a0 = i (print i) 
[00400014] 21080001 addi $8, $8, 1   ; 17: addi $t0, $t0, 1 
[00400018] 0000000c syscall     ; 18: syscall 
[0040001c] 010a082a slt $1, $8, $10   ; 21: blt $t0, $t2, WhileLoop # if i 
[00400020] 1420fffb bne $1, $0, -20 [WhileLoop-0x00400020] 
[00400024] 03e00008 jr $31     ; 23: j $ra 

아래의 오류와 함께 실행 오류

Exception occurred at PC=0x00000000 
    Bad address in text read: 0x00000000 
Instruction references undefined symbol at 0x800001dc 
    [0x800001dc] 0x143a0000 bne $1, $26, 0 [ok_pc-0x800001d8] 
+1

조립조차하지 않습니다. * j $ ra *는 유효한 MIPS 명령어가 아닙니다. 당신은 * jr $ ra *를 의미합니다. – m0skit0

+0

@ m0skit0, 당신 말이 맞아요. –

+1

* jr $ ra *는 MARS 시뮬레이터에서 잘 실행됩니다 (단, $ ra에는 할당 된 값이없고 $ ra로 점프 할 때 충돌이 발생 함). 이 오류가 발생하는 이유는 다음과 같습니다. PC = 0x00000000 예외가 발생했습니다. 텍스트의 잘못된 주소 : 0x00000000 – m0skit0

답변

2
addi $t0, $t0, 0 # i = 0 

$t0 0에 설정이 아니라 변화를 떠나지 않을 것이다. (move $t0, $zero) 또는 (addi $t0, $0, 0) 모두 작동합니다.

또한 $t0$t2이 syscall에 보존되어 있습니까?

마지막으로 게시 한 오류가 코드에 나타나지 않습니다. 스택 추적/레지스터 덤프를 가지고 있습니까? 아니면 그것을 추적하는 데 도움이 될만한 것이 있습니까?

+0

현재 작동 중입니다. ('j $ ra'는 문제를 일으키고 있습니다 ... @m0skit0이 맞다고 생각합니다. 전혀 작동하지 않아야합니다 ...). 나는 syscall이 몇몇 변수를 보존하지 않을지도 모른다는 것을 기억한다. 그러나 그것은 지금까지 효과가있다. 어떻게이 잠재적 인 문제를 해결할 수 있을까? –

+0

스택에 저장하면 [여기] (http://spimsimulator.sourceforge.net/HP_AppA.pdf)에 설명되어 있습니다. 그리고 그것은 @ m0skit0이 맞았을 가능성이 높습니다. SPIM이 조건을 시작한 것을 기억하지 못합니다. – user786653