Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我想找到数组向量的最大值,什么';我的代码(程序集mips)有什么问题?_Assembly_Mips - Fatal编程技术网

Assembly 我想找到数组向量的最大值,什么';我的代码(程序集mips)有什么问题?

Assembly 我想找到数组向量的最大值,什么';我的代码(程序集mips)有什么问题?,assembly,mips,Assembly,Mips,我知道你的代码有什么问题。出于某种原因,第39行: .data Vector: .space 24 promptInt: .asciiz "Please input an integer: " linefeed: .asciiz "\n" enterkey: .asciiz"Press any key to end program." .text main: li $t0,0 li $t1,0 for: bge $t0,6,end_for #loop li $v0,4 la $a0,p

我知道你的代码有什么问题。出于某种原因,第39行:

.data
Vector: .space 24
promptInt: .asciiz "Please input an integer: " 
linefeed: .asciiz "\n"
enterkey: .asciiz"Press any key to end program."

.text
main:

li $t0,0
li $t1,0

for:
bge $t0,6,end_for #loop

li $v0,4
la $a0,promptInt
syscall #print "Please input an integer: "

li $v0,5
syscall #read integer
sw $v0,Vector($t1) #move integer to array Vector  

mul $t1,$t0,4
addi $t0,$t0,1

j for 

end_for: #end of loop

li $t0,0 #i
li $t1,0 #array position
li $t2,0 #max
li $t3,0 #temp

for2:
bge $t0,6,end_for2 #second loop

lw $t3,Vector($t1)

blt  $t3,$t2,if

move $t2,$t3

if:

mul $t1,$t0,4
addi $t0,$t0,1

j for2

end_for2:

li $v0,1
move $a0,$t2
syscall #print sum

li $v0,4  
la $a0,linefeed  
syscall # print linefeed 


li $v0,4
la $a0,enterkey
syscall #print "Press any key to end program."

li $v0,5
syscall #read enter

li $v0,10
syscall #exit
当t1为0时,从数组返回第二个而不是第一个元素。为什么我不知道,因为我从未使用过固定大小的数组。我知道背后的逻辑,但我从来没有用过

我总是使用动态分配数组,使用系统调用9(sbrk)进行动态分配

试试这个:

lw $t3,Vector($t1)
您应该告诉我们您的代码出了什么问题,至少在任何错误消息或意外输出方面。在调试器/模拟器中单步执行,也许您可以找到自己的错误。此外,如果您希望他人帮助您,请更好地注释您的代码。
    .text

LoadArray:
    # ------------
    # arguments:
    # a0 = array length
    # ------------

    move    $t0,    $a0                     #save array length
    mulo    $a0,    $a0,    4               #for n int elements we need 4 * n memory size
    li      $v0,    9                       #system call for dynamic allocation
    syscall                                 #make the call

    move    $t1,    $v0                     #save array address

    li      $t2,    0                       #i = 0
loadarray_loop:
    bge     $t2,    $t0,    loadarray_exit  #when i >= n exit loop

    mulo    $t3,    $t2,    4               #calculate offset [index * 4]
    add     $t4,    $t3,    $t1             #add offset on array address

    la      $a0,    promptInt               #write the message
    li      $v0,    4
    syscall

    li      $v0,    5                       #system call for read int
    syscall                                 #make the call

    sw      $v0,    0($t4)                  #insert element into array
    addi    $t2,    $t2,    1               #i++
    j       loadarray_loop

loadarray_exit:
    move    $v0,    $t1                     #prepare return value
    jr      $ra                             #return

PrintArray:
    # ------------
    # arguments:
    # a0 = array length
    # a1 = array address
    # ------------

    move    $t0,    $a0
    li      $t1,    0

printarray_loop:
    bge     $t1,    $t0,    printarray_exit

    mulo    $t2,    $t1,    4               #calculate offset [index * 4]
    add     $t3,    $t2,    $a1             #add offset on array address

    lw      $a0,    0($t3)                  #get element from array
    li      $v0,    1                       #system call for print int
    syscall                                 #make the call

    li      $a0,    32                      #ascii for space
    li      $v0,    11                      #system call for print char
    syscall                                 #make the call

    addi    $t1,    $t1,    1               #i++
    j       printarray_loop

printarray_exit:
    li      $a0,    10                      #ascii for line feed
    li      $v0,    11                      #system call for print char
    syscall                                 #make the call

    li      $a0,    13                      #ascii for cariage return
    li      $v0,    11                      #system call for print char
    syscall                                 #make the call

    jr      $ra

ArrayMax:
    # ------------
    # arguments:
    # a0 = array length
    # a1 = array address
    # ------------

    li      $t0,    1                       #set counter to 1
    lw      $t1,    0($a1)                  #on the beginning the max is the first element from array

arraymax_loop:
    bge     $t0,    $a0,    arraymax_exit

    mulo    $t2,    $t0,    4               #calculate offset [index * 4]
    add     $t3,    $t2,    $a1             #add offset on array address

    lw      $t4,    0($t3)                  #get element from array
    ble     $t4,    $t1,    arraymax_continue
    move    $t1,    $t4                     #set new max

arraymax_continue:  
    addi    $t0,    $t0,    1               #i++
    j       arraymax_loop

arraymax_exit:
    move    $v0,    $t1                     #prepare result
    jr      $ra

main:
    #entry point
    li      $v0,    5                       #ask user to insert array length
    syscall
    move    $s0,    $v0                     #save n

    move    $a0,    $v0
    jal     LoadArray
    move    $s1,    $v0                     #save array address

    move    $a0,    $s0                     #print array
    move    $a1,    $s1
    jal     PrintArray

    move    $a0,    $s0                     #obtain max
    move    $a1,    $s1
    jal     ArrayMax

    move    $a0,    $v0                     #print max element
    li      $v0,    1
    syscall

    li      $v0,    10
    syscall                                 #make the call

.data
    promptInt: .asciiz "Please input an integer: "