【问题标题】:User ask how many input you want to take and then show their sum in mips用户询问您要接受多少输入,然后以 mips 显示他们的总和
【发布时间】:2017-10-26 08:24:12
【问题描述】:

我想用 mips 编写一个程序,用户将在其中输入他想要输入的数量。最后,程序将打印输入的总和。

这是我的代码:

 .data

    myMessage:  .asciiz "ENTER numbers you want to sum\n"
    value:      .asciiz "ENTER  Value \n"

    sum :       .word 0


 .text

    li $v0, 4
    la $a0, myMessage
    syscall

    li $v0, 5
    syscall

    move $t0, $v0         #num of time user will enter num

    la $t1, 0         #count value first initiallize to 0

see:
    bne $t1,$t0,add         #checking if  count is less than the num of value 



    li  $v0, 1              #printing sum finally
    la $a0, ($s2)

add:
    li $v0,4
    la $a0,value
    syscall

    li $v0,5
    syscall

    move $t3,$v0


    la $a1, sum     #load address of 'bal' in '$a1'
    lw $s3, 0($a1)      #load sum from '$a1' to '$s2' (initially 0)
    add $s3, $s3, $t3   #adding the sum 
    sw $s2, 0($a1)      #load latest sum ('$s2') in .word balance ('$a1')

    addi $t1,$t1,1                    inc in count

    j see

问题是程序在输入所需数量后并没有停止,而是继续请求新的输入。

【问题讨论】:

    标签: loops mips


    【解决方案1】:
    .data      # Data declaration section
    
        instring1:    .asciiz  "ENTER numbers you want to sum\n"
        instring2:    .asciiz  "Enter value\n"
        outstring:    .asciiz  "Sum: "
    
    .text#
    main: 
    #Print instring1
        li $v0, 4           # system call code for printing string = 4
        la $a0, instring1   # load address of string to be printed into $a0
        syscall             # call operating system to perform operation in $v0
                            #     syscall takes its arguments from $a0, $a1,
    
    #Taking n as input
        li $v0, 5 # read int
        syscall
        move $s0, $v0 # the result of the syscall is stored in v0
                    # we move it to t0 to prevent overwriting
    
    #Creation heap memory
        mul $t1, $s0, 4
        li $v0, 9
        move $a0, $t1
        syscall
        move $s1, $v0
            
    
    #Print instring2
        li $v0, 4           # system call code for printing string = 4
        la $a0, instring2  # load address of string to be printed into $a0
        syscall             # call operating system to perform operation in $v0
                            #     syscall takes its arguments from $a0, $a1,
    
        li   $s2, 0         # $s2 is the index, and loop induction variable
            
    Start_Input:  
        bge  $s2, $s0, End_Input
    
        li $v0, 5           # Read integer values
        syscall
        
        mul  $t0, $s2, 4    # $t0 is the offset
        add  $t1, $s1, $t0  # $t1 is the address of desired index
        sw   $v0, ($t1)     # store the value in the array
        addi $s2, $s2, 1    # increment the index        
        j    Start_Input
    
    End_Input:
        add $t0, $zero, $zero # i is initialized to 0, $t0 = 0
        add $s2, $zero, $zero # sum = 0
        beq $s0, $zero, print_sum # if number = 0 then goto print_sum
    
    Loop: #stuff
        mul $t1, $t0, 4
        add  $t2, $s1, $t1
        lw $t3, ($t2)
        add $s2, $s2, $t3
    
        addi $t0, $t0, 1 # i ++
        slt $t1, $t0, $s0 # $t1 = 1 if i < n
        bne $t1, $zero, Loop # go to Loop if i < n
    
    #Print Sum
    print_sum:
        li $v0, 4           # system call code for printing string = 4
        la $a0, outstring   # load address of string to be printed into $a0
        syscall             # call operating system to perform operation in $v0
                            #     syscall takes its arguments from $a0, $a1,
        li $v0 1 # print int
        move $a0 $s2
        syscall
    
    #Exit Syscall
    EXIT:
        li $v0 10# exit
        syscall
    

    这是工作代码。提供注释以理解代码。

    【讨论】:

      【解决方案2】:
      .data 
      myMessage:.asciiz "ENTER numbers you want to sum\n" 
      value:.asciiz "ENTER  Value: "
      show: .asciiz "\nSum is: "
      .text 
      li $v0,4 
      la $a0,myMessage 
      syscall 
      li $v0,5 
      syscall
      move $t0,$v0    #num of time user will enter num
      la $t1, 0   #count value first initiallize to 0
      la $t5, 0
      see:
      bne $t1,$t0,add #checking if  count is less than the num of value
      li $v0, 4
      la $a0, show
      syscall     #print message "Sum is: "
      li $v0, 1
      move $a0, $t5
      syscall     #print the result
      j end
      add: 
      li $v0,4 
      la $a0,value 
      syscall
      li $v0, 5
      syscall
      add $t5, $t5, $v0
      sub $t0, $t0, 1
      j see
      end:
      

      【讨论】:

        猜你喜欢
        • 2022-08-23
        • 1970-01-01
        • 2013-10-10
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        相关资源
        最近更新 更多