【问题标题】:MIPS: Printing Out a HistogramMIPS:打印出直方图
【发布时间】:2013-04-05 06:28:03
【问题描述】:

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

例如:

用户输入1、2、3、4

输出:

*
**
***
****

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

# 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

【问题讨论】:

    标签: mips


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2013-09-26
      • 2017-07-21
      • 2014-12-08
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      相关资源
      最近更新 更多