Arrays 如何计算MIPS中的数组模式

Arrays 如何计算MIPS中的数组模式,arrays,assembly,mips,Arrays,Assembly,Mips,一天以来一直在尝试计算MIPS中数组的模式?我真的搞不懂 要查找数组中已排序整数列表的模式,请从数组的第一个元素开始,循环整个数组。 我们保留5个寄存器,以帮助我们找到元素的模式 保留数组上一个元素的值。 指向正在遍历的元素的指针。 一种寄存器,用于保存数组中重复的元素的计数。 保存寄存器值的寄存器 记录当前模式计数的寄存器。 在ModeLoop中,遍历数组,一旦遇到新元素,就跳转到updateifneeded指令块。 如果当前模式的计数大于先前的模式计数,则跳转到changeMode, 您可以

一天以来一直在尝试计算MIPS中数组的模式?我真的搞不懂

要查找数组中已排序整数列表的模式,请从数组的第一个元素开始,循环整个数组。 我们保留5个寄存器,以帮助我们找到元素的模式

保留数组上一个元素的值。 指向正在遍历的元素的指针。 一种寄存器,用于保存数组中重复的元素的计数。 保存寄存器值的寄存器 记录当前模式计数的寄存器。 在ModeLoop中,遍历数组,一旦遇到新元素,就跳转到updateifneeded指令块。 如果当前模式的计数大于先前的模式计数,则跳转到changeMode, 您可以在其中更改模式的值以及模式的计数。 完成updateifneeded块后,执行back块,其中 当前模式增加,循环索引增加1,数组指针增加4。 包含前一个元素的寄存器将使用我们刚刚遍历的值进行更新

.data
modeState:    .asciiz "Mode:"
newline: .asciiz "\n"
array:   .word 1, 1, 1, 2, 2, 2, 3, 3, 3, 4
         .word 4, 4, 4, 4, 5, 5, 5, 5, 5, 6
         .word 7, 8, 8, 8, 8, 8, 8, 9, 10, 10
length:  .word 30
mode: .word 0
    
.text
.globl main
main:


#loop through the array to calculate mode

la $t0 array #array's starting address
li $t1 0     #loop index, i=0
lw $t2 length  #length
li $t4, 1 #previous
li $t6, 1 #intial
li $t7, 0 #individualCount
li $t8, 0 #modeValue
li $t9, 0 #modeCount

ModeLoop:
lw $t5 ($t0)   #get array[i]

#when a new value in encountered in the array
bne $t4 ,$t5 , updateifneeded

back:
addi $t7 $t7 1 #individualcount++
addi $t1 $t1 1 #i = i+1
add $t0 $t0 4 #update array address
li $t4 ,0
addi $t4 , $t5, 0

blt $t1 $t2 ModeLoop


#printing mode statement
li $v0,4
la $a0, modeState
syscall

move $a0 $t8
li $v0 1
syscall

#giving space of a line
li $v0,4
la $a0, newline
syscall


li $v0 10
syscall
.end main

updateifneeded:
#if the count greater that earlier mode count
bgt $t7, $t9, changeMode
next:
li $t6 ,0
addi $t6 , $t5, 0
#reintializing individual count
li $t7, 0
j back

changeMode:
#changing modevalue
li $t8 ,0
addi $t8 , $t4, 0
#changing modeCount
li $t9 ,0
addi $t9 , $t7, 0
j next

先用C语言编写,然后翻译成汇编语言。欢迎使用SO!请分享您的代码尝试。排序数组的好算法,但对于编码样式,将指令缩进标签右侧更好,因此更容易看到块结构。此外,一些细节可能更有效。e、 g.循环条件可以在p!=(完)。在循环之外计算一个结束指针,就像或在这种情况下,只需在数组和la的末尾添加一个标签,而不是在硬编码的lengthAlso上使用lw,在覆盖它之前不需要将寄存器归零。在changeMode中,只需使用addi$t8,$t4,0覆盖旧值,而不必先执行li$t8,0。或者使用move$t8,$t4,这是编写相同addi指令的一种更简单的方法。此外,当有这么多不同的块时,back和next不是很清楚的名称。像modeLoop_afterUpdate这样的名称会更清晰,而不是back。但我渴望打字和阅读。@SamraNorman欢迎来到SO!OP没有提到数组的性质,所以我不确定我们是否可以假设它已经排序了。不过,谢谢你的描述性回答。