2013-04-05 46 views
0

我正在写一个MIPS程序(汇编语言),它采用10个整数并打印出一个由星号表示的直方图。MIPS:打印出一个直方图

例如为:1,2,3,4

输出的

用户输入:

* 
** 
*** 
**** 

我有最这个代码在MIPS已经写入的。我遇到的问题是打印出正确长度的星号。到目前为止,它只是打印出一个长度相同的直方图; FIRST用户输入整数。

# program functionality: 

。数据

menu: .asciiz  "\n1. New Histogram\n2. Print Histogram\n3. Quit\n" 
prompt: .asciiz  "\nEnter 10 numbers between 0 and 50 (inclusive):\n" 
prompt1: .asciiz "\nEnter a valid number:\n" 
asterisk: .asciiz "*" 
space: .asciiz  "\n" 
array: .word  0:10 

的.text 主:

do: 

    jal print_menu 
    li $v0, 5 
    syscall 

    beq $v0, 1, new 
    beq $v0, 2, print 
    beq $v0, 3, quit 
j do # end do 

    new: 
     jal new_user 
     j do 
    print: 
     jal print_user 
     j do 

j quit 

print_menu: 

    la $a0, menu 
    li $v0, 4 
    syscall 
    jr $ra 


new_user: 
    la $a0, prompt 
    li $v0, 4 
    syscall 


    enter_loop: 

     la $t0, array 
     li $t1, 10 

     enter_loop_2: 

      la $a0, prompt1 
      li $v0, 4 
      syscall 

      li $v0, 5 
      syscall 

      sw $v0, ($t0) 

      addi $t1, $t1, -1 
      beqz $t1, end_loop_2 

      addi $t0, $t0, 4 
      j enter_loop_2 


      end_loop_2: 
      jr $ra 


print_user: 
    la $t0, array 
    li $t1, 10 

    pLoop: 

    la $a0, space 
    li $v0, 4 
    syscall 


     asterisk_fun: 


      li $v0, 1 
      lw $a0, ($t0) 
      syscall 


      counter: 

       la $a0, asterisk 
       li $v0, 4 
       syscall 

       addi $a0, $a0, -1 
       beqz $a0, asterisk_end 

       j counter 

      asterisk_end: 

       jr $ra 



     addi $t1, $t1, -1 
     beqz $t1, endpLoop 

     addi $t0, $t0, 4 

     j pLoop 


     endpLoop: 
     jr $ra 



quit: 
    li $v0, 10 
    syscall 

回答

1

的问题是,你是覆盖在带星号的地址计数器注册$a0,并且还使用$a0来计算该存储桶中的项目数量。 容易的解决方案是使用其他寄存器(例如$a1)进行计数的项目数:

这将是:

 #... your code 
    asterisk_fun: 
     li $v0, 1 
     lw $a1, ($t0) # Load number in $a1 
     move $a0, $a1 # move to $a0 just to print it 
     syscall 
      la $a0, asterisk 
     counter: 

      li $v0, 4 
      syscall 

      addi $a1, $a1, -1   # we use $a1 to keep the counter 
      beqz $a1, asterisk_end 

      j counter 

     asterisk_end: 
    # ... more of your code