2010-03-20 8 views
3

사용자가 입력 한 문자열이 회문인지 여부를 결정하는 프로그램을 MIPS에 작성하는 중입니다. 그것은 건설중인 세 가지 서브 루틴을 가지고 있습니다.
여기 코드의 주요 블록, 서브 루틴은 관련 정보와 함께 다음과 같이하십시오MIPS : 문자열에서 영숫자가 아닌 문자 제거

.data 
Buffer: .asciiz "                    " # 80 bytes in Buffer 
intro: .asciiz "Hello, please enter a string of up to 80 characters. I will then tell you if that string was a palindrome!" 
     .text 
main: 
    li $v0, 4  # print_string call number 
    la $a0, intro # pointer to string in memory 
    syscall 
    li $v0, 8  #syscall code for reading string 
    la $a0, Buffer #save read string into buffer 
    li $a1, 80  #string is 80 bytes long 
    syscall 
    li $s0, 0  #i = 0 
    li $t0, 80  #max for i to reach 
    la $a0, Buffer 
    jal stripNonAlpha 
    li $v0, 4  # print_string call number 
    la $a0, Buffer # pointer to string in memory 
    syscall 
    li $s0, 0 
    jal findEnd 
    jal toUpperCase 
    li $v0, 4  # print_string call number 
    la $a0, Buffer # pointer to string in memory 
    syscall 

첫째,이 손 전에 문자열에서 모든 비 영숫자 문자를 제거하기로되어 있지만,의 IT를 위해 지정된 문자를 발견 한 경우 제거 후에는 모든 문자가 제거됩니다.

stripNonAlpha: 
    beq $s0, $t0, stripEnd #if i = 80 end 
    add $t4, $s0, $a0  #address of Buffer[i] in $t4 
    lb $s1, 0($t4)  #load value of Buffer[i] 
    addi $s0, $s0, 1  #i = i + 1 
    slti $t1, $s1, 48  #if ascii code is less than 48 
    bne $t1, $zero, strip #remove ascii character 
    slti $t1, $s1, 58  #if ascii code is greater than 57 
        #and 
    slti $t2, $s1, 65  #if ascii code is less than 65 
    slt $t3, $t1, $t2  
    bne $t3, $zero, strip #remove ascii character 
    slti $t1, $s1, 91  #if ascii code is greater than 90 
        #and 
    slti $t2, $s1, 97  #if ascii code is less than 97 
    slt $t3, $t1, $t2 
    bne $t3, $zero, strip #remove ascii character 
    slti $t1, $s1, 123  #if ascii character is greater than 122 
    beq $t1, $zero, strip #remove ascii character 
    j stripNonAlpha  #go to stripNonAlpha 
strip: 
    #add $t5, $s0, $a0  #address of Buffer[i] in $t5 
    sb $0, 0($t4)  #Buffer[i] = 0 
    #addi $s0, $s0, 1  #i = i + 1 
    j stripNonAlpha  #go to stripNonAlpha 
stripEnd: 
    la $a0, Buffer  #save modified string into buffer 
    jr $ra   #return 

둘째,는 대문자로 모든 소문자를 변환 할 예정이다.

toUpperCase: 
    beq  $s0, $s2, upperEnd 
    add $t4, $s0, $a0 
    lb $s1, 0($t4) 
    addi $s1, $s1, 1 
    slti $t1, $s1, 97 
    #beq $t1, $zero, upper 
    slti $t2, $s1, 123 
    slt $t3, $t1, $t2 
    bne $t1, $zero, upper 
    j toUpperCase 
upper: 
    add $t5, $s0, $a0 
    addi $t6, $t6, -32 
    sb $t6, 0($t5) 
    j toUpperCase 
upperEnd: 
    la $a0, Buffer 
    jr $ra 

문자열이 회문인지 확인하는 최종 서브 루틴은 현재 거의 완료되지 않았습니다. PC-SPIM이 캐리지 리턴 문자로 사용하는 것이 확실하지 않기 때문에 문자열 끝을 찾는 데 문제가 있습니다.

도움이된다고 생각합니다. 내 문제는 바보 같고 어리 석으므로 내 문제의 대부분이 너무 작아도 아무 것도 지적하지 않아도됩니다.

답변

0

이 같은 일을하여 값을 찾을 수 있습니다

syscall to reading a string 
mov first value to $2 
check the value of $2 with PC-SPIM or a debugger 
3

어, 이건 정말 오래된 질문이지만, 문제는 널 문자로 영숫자가 아닌 문자를 대체하고 있다는 것입니다 그 시점에서 문자열을 종료합니다.

관련 문제