2014-10-17 2 views
0

I는 사용자로부터 입력 된 문자열을 받아 연속 동일한 문자의 긴 문자열 MIPS의 출력을 이용하여 프로그램을 작성하고있다. 내 문제는 프로그램이 대상 문자열을 출력하기 전에 '끝'에 도달 한 것으로 보입니다. 어떤 도움을 주셔서 감사합니다!산출 길이 MIPS

main: 
    la $a0,input_msg  # Prompting input from user 
    li $v0,4 
    syscall 

    li $v0, 8    # Reading string and storing in memory 
    la $a0, input_string 
    li $a1, 100 
    syscall 


    li $t0, 0 
    la $t1, input_string   # address of the first element 
    lb $a0, ($t1)    # input_string[0] (the first character) 

    move $s0, $a0   # current_char=read_char(); 
    move $s1, $a0   # previous_char = input_string[0]; 
    move $s2, $a0   # final_char=input_string[0]; 

    li $s3, 1   # current_num_chars=1; 
    li $s4, 1   # final_num_chars=1; 


    la $t5, new_line 

loop: 

    addi $t0, $t0, 1  # for(k=1; k<i-1; k++) { 
    add $t1, $t1, $t0  
    lb $t3, ($t1) 
    beq $s5, $t3, print_final 
    move $s0, $t3   # current_char=input_string[k]; 

    bne $s0, $s1, else   # if(current_char == previous_char) 
    addi $s3, $s3, 1  # current_num_chars++; 

    bge $s3, $s4, increase_final # if(current_num_chars >= final_num_chars) {  

    move $s1, $s0 
    j loop    # else do nothing 

increase_final: 

    move $s2, $s0   # final_char=current_char; 
    move $s4, $s3   # final_num_chars=current_num_chars; 

    move $s1, $s0 
    j loop    # } 


else: 
    move $s1, $s0 
    j loop    # else { 
        # current_num_chars=1; 
        # } 
        # } 

print_final: 

    la $a0, output_msg 
    li $v0, 4 
    syscall 

    li $t2, 0 

print_chars:  

    li $t2, 0   # for(k=0; k<final_num_chars; k++) { 
    beq $t2, $s3, end 

    move $a0, $s2   # print_char(final_char); 
    li $v0, 11 
    syscall 

    j print_chars   # } 

end: 

    li $v0, 4   # print_string("\n"); 
    la $a0, new_line 
    syscall 

    li $v0, 10   # exit() 
    syscall 

답변

1

귀하의 print_chars 루프는 끝으로 이동할지 여부를 결정 $s3에 (그냥 0으로 설정하는) $t2를 비교합니다. 따라서, 항상 같은 비교를하며, 루프 중 하나가 발생, 또는 종료되지 않습니다 처음으로 종료됩니다.

덧글에 따르면 $s4이 아니라 $s3과 비교해야한다고 나와 있습니다. 물론

+0

아! 나는 심지어 그것을 알아 차리지 않고 있었다! 감사! 불행하게도 이제는 실행되지만'loop : \t을 시작하는 섹션 인 ln58에 관한 오류가 발생합니다. addi $ t0, $ t0, 1 \t # for (k = 1; k

+0

원래 코드가 바뀌었고'la $ s4, new_line'이 아닌 'la $ s5, new_line'이되어야합니다. 그리고'bge $ t0, $ t8, end'는'beq $ s3, $ s5, print_c hars' –

+0

새 코드 및 문제/w 질문을 편집 할 수 있습니다하지 않는 한,이 질문을 닫습니다 및 새 게시하시기 바랍니다. –