2017-01-31 34 views
2

모음의 수를 MIPS 단위로 계산하는 프로그램을 작성해야합니다. 현재 코드가 QtSPim에서 한계를 벗어난 메모리를 제공합니다. MIPS의 초급 단계에 있으므로 도움이 될 것입니다. 지금까지 코드 : 게시 된 코드가 없는지 등을 라벨을 가지고 있기 때문에주어진 문자열에서 모음 수 찾기 MIPS

.data 
    str: .space 20 
my_chars: .space 20 
vow1: .byte 'a' 
vow2: .byte 'e' 
vow3: .byte 'i' 
vow4: .byte 'o' 
vow5: .byte 'u' 
.text 
main: 
li $s0,0     #initilaze loop var1 
li $t0,20     #initialize loop var2 
li $s1,0     #initialize counter 
la $t1, my_chars    # base address of array 
li $a1,20      #max input to be read 
li $a0,8 
syscall 
loop: 
beq $s0, $t0, exit 
la $t2, str     #string into t2 
lb $v0, 0($t2)     #access first index 
lb $t9, vow1 
beq $v0, $t9, then    #comparing to a 
then: 
addi $s1, $s1, 1 

lb $t8, vow2 
beq $v0, $t8, then1    #comparing to e 
then1: 
addi $s1, $s1, 1 
lb $t7, vow3 
beq $v0, $t7, then2    #comparing to i 
then2: 
addi $s1, $s1, 1 
lb $t6, vow4 
beq $v0, $t6, then3    #comparing to o 
then3: 
addi $s1, $s1, 1 
lb $t5, vow5 
beq $v0, $t5, then4    #comparing to u 
then4: 
addi $s1, $s1, 1 

addi $t1, $t1,1    #increment base address 
addi $s0, $s0,1    #increment loop variable 
j L1 
syscall 
+0

: 이것은 또한 필요한 레지스터의 수는

내가 [무상 스타일의 정리를 용서하십시오] 누락 된 상용구/콜을 추가 (즉, 복잡성 감소) 감소 , 그리고 오류가 참조하는 코드 행. – Michael

+0

메시지를 볼 수있는 범위 밖의 메시지를 표시합니다. –

+0

내가 말했듯이 ** 정확한 **, ** 완료 ** 메시지를 게시하고 오류 메시지가 표시된 코드 줄을 지적해야합니다 을 참고하여. – Michael

답변

0

내가 런타임 오류를 찾기 위해 그것을 실행할 수 없습니다.

육안 검사에서 사용자 입력 코드의 읽기에는 몇 가지 문제점이있었습니다. li $a0,8li $v0,8 [문자열을 읽는 syscall 번호] 여야합니다. $a0에는 읽을 버퍼의 주소가 있어야합니다. 귀하의 코드에서이 주소는 8이고 유효한 주소는 아닙니다. 따라서 la $a0,my_chars 또는 la $a0,str과 같은 것을 원할 것입니다. 그 중 하나는 입력 버퍼 여야하며 다른 하나는 불필요한 것으로 보입니다.

[교육 된 추측을 기반으로] 레이블을 추가하려고 할 때 모음이 배열에 있으면 프로그램을 훨씬 간단하게 만들 수 있음을 알고 코드를 리팩토링했습니다.

경계 초과 문제의 또 다른 잠재적 원인 일 수있는 카운트를 줄이기보다는 EOS (0x00)를 찾기 위해 루프 종단을 변경했습니다.

.data 
vowel:  .asciiz  "aeiou" 
msg_prompt: .asciiz  "Enter string: " 
msg_out: .asciiz  "Number of vowels is: " 
msg_nl:  .asciiz  "\n" 
str:  .space  80 

    .text 
    .globl main 
main: 
    # print user prompt 
    li  $v0,4 
    la  $a0,msg_prompt 
    syscall 

    # get string to scan 
    li  $v0,8 
    la  $a0,str 
    li  $a1,80 
    syscall 

    li  $s2,0     # initialize vowel count 
    la  $s0,str     # point to string 

# registers: 
# s0 -- pointer to string character 
# s1 -- pointer to vowel character 
# s2 -- count of vowels 
# 
# t0 -- current string character 
# t1 -- current vowel character 
string_loop: 
    lb  $t0,0($s0)    # get string char 
    addiu $s0,$s0,1    # point to next string char 
    beqz $t0,string_done   # at end of string? if yes, fly 

    la  $s1,vowel    # point to vowels 

vowel_loop: 
    lb  $t1,0($s1)    # get the vowel we wish to test for 
    beqz $t1,string_loop   # any more vowels? if not, fly 
    addiu $s1,$s1,1    # point to next vowel 
    bne  $t0,$t1,vowel_loop  # is string char a vowel? -- if no, loop 
    addi $s2,$s2,1    # yes, increment vowel count 
    j  string_loop    # do next string char 

string_done: 
    # print count message 
    li  $v0,4 
    la  $a0,msg_out 
    syscall 

    # print vowel count 
    li  $v0,1 
    move $a0,$s2 
    syscall 

    # print a newline 
    li  $v0,4 
    la  $a0,msg_nl 
    syscall 

    # exit program 
    li  $v0,10 
    syscall 
가 귀하의 질문은 최소한 정확한 오류 메시지를 포함해야