2012-10-05 2 views
2

그래서 지금 우리는 문자열을 가져 와서 모든 대문자로 변환 한 다음 toUpper 또는 toLower 바이트가 아무 것도 아닌 경우 소문자로 변환해야하는 프로젝트를 진행하고 있습니다. 0. 지금은 여전히 ​​대문자 부분에서 작업하고 있습니다. (소문자는 거의 같을 것이라고 추측합니다.) 그러나 문자열을 통해 대문자를 찾을 때나 시스템 콜을 호출 할 때 중 하나에 걸릴 수 있습니다. 인쇄. 어떤 도움이라도 좋을 것입니다. 여기에 지금까지 가지고 무엇 :이mips 어셈블리에서 문자열을 반복하는 방법

lb  $t3, 8($t2) 

해야

.data 

    toUpper: .byte 1 
    toLower: .byte 0 

    string: 
     .asciiz " A long time ago in a Galaxy far, far away...." 

# Your code goes below this line 

    origString: 
     .asciiz "Original string:\n" 

    toUpForwardStr: 
     .asciiz "\nConverted to upper-case:\nForward:\n" 

    toLowerForwardStr: 
     .asciiz "\nConverted to lower-case:\nForward:\n" 

    backwardStr: 
     .asciiz "Backward:" 

.text 



main: 
    # Function prologue 
    subu $sp, $sp, 24     # allocate stack space -- default of 24 here 
    sw  $fp, 0($sp)      # save caller's frame pointer 
    sw  $ra, 4($sp)      # save return address 
    addiu $fp, $sp, 20     # setup main's frame pointer 

    la  $a0, origString    #Print "Original String:" 
    addi $v0, $zero, 4 
    syscall 

    la  $a0, string     #Print string 
    addi $v0, $zero, 4 
    syscall 

    la  $s0, toUpper 
    sb  $s1, 0($s0)     #toUpper stored in $s1 

    la  $s0, toLower 
    sb  $s2, 0($s0)     #toLower stored in $s2 

    bne  $s1, $zero, toUpperCase  #Jump toUpperCase if toUpper ≠ 0 



    toUpperCase: 
     la  $a0, toUpForwardStr  #Print "Converted to upper-case:" 
     addi $v0, $zero, 4    #  "Forward:" 
     syscall 

     la  $s3, string    #$s3 holds address to string 

     addi $s1, $zero, 0    #$s1 = i = 0 

     j upperCaseLoop     #Goto upperCaseLoop 

     upperCaseLoop: 

      # Compute address of string[i] 

      add  $t2, $s3, $s1   # $t2 = address of string[i] 
      lb  $t3, 8($t2)    # $t3 = elements[i] 

      beq  $t3, $zero, upperDone # test if for loop is done 

      addi $t6, $zero, 96   #$t6 = 96 (lowercase letters) 
      bgt  $t3, $t6, isLowercase1#If letter is lowercase goto isLowercase1 

      comeBackFromLowercaseIfs: 

      move $t3, $a0 
      addi $v0, $zero, 11 
      syscall 




      addi $s1, $s1, 1    # i++ 
      j  upperCaseLoop 

    upperDone: 

    bne  $s2, $zero, toLowerCase  #Jump toLowerCase if toLower ≠ 0 


    toLowerCase: 

     la  $a0, toLowerForwardStr #Print "Converted to lower-case:" 
     addi $v0, $zero, 4    #  "Forward:" 
     syscall 
     j  done      #The END!! 







    isLowercase1: 
     addi $t7, $zero, 123   #$t7 = 123 
     blt  $t3, $t7, isLowercase2 #Goto isLowercase2 
     j  comeBackFromLowercaseIfs #Go back to uppercaseLoop 

    isLowercase2: 
     addi $t3, $zero, -30   #changes letter to lowercase 
     j  comeBackFromLowercaseIfs #Go back to uppercaseLoop 



done:  
    # Epilogue for main -- restore stack & frame pointers and return 
    lw $ra, 4($sp)  # get return address from stack 
    lw $fp, 0($sp)  # restore the caller's frame pointer 
    addiu $sp, $sp, 24 # restore the caller's stack pointer 
    jr $ra    # return to caller's code 

답변

2

1이

move $t3, $a0 

move $a0, $t3 

이 있어야한다

lb  $t3, 0($t2) 

3이

addi $t3, $zero, -30   #changes letter to lowercase 

addi $t3, $t3, -32   #changes letter to lowercase 
+0

굉장해야합니다! 감사합니다 patrik, 잘 작동합니다. 나는 너무 오랫동안 코드를보고 있었다고 생각한다. (그리고 잠시 후 Mips를 알고 있으면 모두 똑같이 보인다) – Greg

관련 문제