【发布时间】:2021-03-27 13:04:01
【问题描述】:
从一天开始就一直在尝试在 MIPS 中计算数组的模式?实在想不通!
【问题讨论】:
-
先用C做,再翻译成汇编。
-
欢迎来到 SO!请分享您的代码尝试。
从一天开始就一直在尝试在 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
【讨论】:
do{} while( p != endp ),而不是将计数器增加到一个长度。在循环之外计算一个终点指针,如this Q&A(或者在这种情况下,只需在数组末尾放置一个标签,la,而不是在硬编码长度上使用lw)
changeMode 中,只需使用addi $t8, $t4, 0 覆盖旧值,无需先执行li $t8, 0。 (或者使用move $t8, $t4,这是编写相同addi指令的一种更简单的方法。)
back 和 next 当你有这么多不同的块时不是很清楚的名字。而不是back,像modeLoop_afterUpdate 这样的名称会更清晰。 (但打字和阅读时间很长。)