MIPS:打印直方图

时间:2013-04-05 06:28:03

标签: mips

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

E.g:

用户输入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 个答案:

答案 0 :(得分: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
相关问题