2014-09-14 1 views
0
loop: 
    lb $t0 0($a0) 
    beqz $t0 done   
    bne $t0 $a1 continue 

    sb $a2 0($a0) 

    continue: 
    addi $a0 $a0 1 
    j loop 

분기 왜 아직도 문 bne $t0 $a1 continue 내가 xspim에서 확인하고 그들이 동일한 경우에도 분기합니다.MIPS 조건문 BNE는 항상이 루프 그냥 문자열을 통해 것입니다

기본적으로 프로그램은 $t0 == $a1 일 때 분기하지 않아야합니다. $a1' ' 문자이며, sb $a2 0($a0) 문으로 이동해야합니다. 따라서 xpsim에서 실행하고 $t0 = 20 (16 진수이므로 ASCII 코드는 ' ') 일 때 ' '$a0과 같아야합니다.

따라서 continue 문으로 분기하여 그 아래의 문을 실행하면 안됩니다. 나는 추측이 정확하지 않다고 생각한다.

답변

1

이상한. 나는 이것을 테스트하는 SPIM 프로그램 작성 :

.data  
str: .asciiz "test test test" 

.text 
main: 
    la  $a0, str 
    addi $a1, $zero, 32 
    addi $a2, $zero, 64 

loop: 
    lb  $t0, 0($a0) 
    beq  $t0, $zero, done 
    bne  $t0, $a1, continue 
    sb  $a2, 0($a0) 

continue: 
    addi $a0, $a0, 1 
    b  loop 

done: 
    addi $v0, 4 
    la  $a0, str 
    syscall 

    addi $v0, $zero, 10 
    syscall 

을 그리고 예상대로, "[email protected]@test"를 반환합니다. '실제'MIPS에서 몇 가지 예기치 않은 일이 발생할 수 있습니다.
1. 분기에는 분기 지연 슬롯이 있으며 분기가 수행되었는지 여부에 관계없이 분기 이후의 명령어가 실행됩니다.
2. 분기는 다른 분기의 분기 지연 슬롯에있을 수 없습니다.
원시 MIPS 컴퓨터를 시뮬레이트하도록 SPIM을 설정하지 않았는지 확인하십시오. 그렇지 않으면 코드가 작동하지 않습니다.

+1

나는 그것을 얻지 못한다, 나의 프로그램은 너의 것과 너무 비슷하지만, 공간을 채우지 않을 것이다! 이상한. xspim에서 "sb $ a2, 0 ($ a0)"위로 뛰어 넘을 때 참조하십시오. 그래서 이것이 공백이 채워지지 않는 이유라고 생각했습니다. 나는 다른 오류를 둘러 볼 것입니다. 그러나 당신의 것과 얼마나 비슷한 지 매우 이상합니다. 그래도 감사합니다! –

+1

나는 그것을 발견했다! 마침내! –