我陷入了堆栈。我必须呼吁mips-32
汇编代码中的功能,其中我必须仅通过将n
和x
作为参数来评估HERMITE多项式。必须使用递归完成。
我尝试使用两个同时使用两个基本情况H0
和H1
,但我无法识别序列和使代码清晰的桩绘制。
遵循代码:
li $t2,2
recursive_hermite: #H(n,x,___,___)
bge $a0,$t5,more_than_2
#### base
#### case
jr $ra ##<--- this takes us to the operation of the value
more_than_2:
## here you are supposed to store the values on stack
## (such as return address and n values)
addi $a0,$a0,-1 ##you must decrease n (or increase I'm not sure)
jal recursive_hermite ##once they are stored, you just recall
### operations of value
## $f12 must contain the whole value
jr $ra ####this one returns to the main
有人知道如何解决这个问题吗?
我看到你陷入困境。判断您写的问题的方式似乎是明天到期的,因此我们必须快速解决问题。
您让我想起了20年前的我自己,当时C 刚出生,而大会很流行。我听说过像QTSPIM这样的肮脏的MIP仿真器,您应该避免它们,就像一个真正方便的硬件的真正男人一样工作。
这是我的提示:您必须存储每次递归中测试的聚元素的部分结果。为此,您必须控制时间和空间,这些时间和空间必须像所有事物一样完美平衡。
如果我是您,我将开始逐步执行程序,以便您检查寄存器值是什么。
一个人去是很危险的,请接受:
.data
#COMPUTER PRINCIPLES UNIVERSITY OF MACANDCHESTER
#PRACTIC 5: HERMITE POLINOMYALS CALCULUS
#JACK ROBERTS II
userInput: .space 700
empty: .asciiz "Input is empty."
long: .asciiz "Input is too long."
invalid: .asciiz "Invalid base-33 number."
.text
ErrorLong:
#prints message for input that is too long
la $a0, long
li $v0, 4
syscall
j end
ErrorInvalid:
#prints message for invalid input
la $a0, invalid
li $v0, 4
syscall
j end
ErrorEmpty:
#prints message for empty string
la $a0, empty
li $v0, 4
syscall
j end
.globl main
main:
li $v0, 8
la $a0, userInput
li $a1, 200
syscall
Rid:
#takes care of leading spaces
li $t9, 32 # space
lb $t8, 0($a0)
beq $t9, $t8, Character
move $t8, $a0
j length
Character:
addi $a0, $a0, 1
j Rid
#takes care of length
length:
addi $t0, $t0, 0
addi $t1, $t1, 10
add $t2, $t2, $a0
#itertates through the array
traverse:
lb $s2, 0($a0)
beqz $s2, discovered
beq $s2, $t1, discovered
addi $a0, $a0, 1
addi $t0, $t0, 1
j traverse
#busted empty space or input that violates limit
discovered:
#if it's empty go to case for empty which outputs
beqz $t0, ErrorEmpty
slti $t4, $t0, 5
#if it's too long, go to case for too long and print
beqz $t4, ErrorLong
move $a0, $t2
#go to next verification process
j verify
#Comenzamos a calcular H0
verify:
lb $s3, 0($a0) #loads address here
beqz $s3, initial
beq $s3, $t1, initial
slti $t3, $s3, 48 #invalid for anything below 0
bne $t3, $zero, ErrorInvalid
slti $t3, $s3, 58 #legal input for everything less than or equal to 9
bne $t3, $zero, Move
slti $t3, $s3, 65 #legal input for everything less than or equal to 65, 'a'
bne $t3, $zero, Move
slti $t3, $s3, 88 #legal input for anything less than or equal to 88
bne $t3, $zero, Move
slti $t3, $s3, 97 # invalid input, not numerical nor alphabetical
bne $t3, $zero, ErrorInvalid
slti $t3, $s3, 120 #legal input for lower case characters
bne $t3, $zero, Move
bgt $s3, 119, ErrorInvalid # illegal input, out of range
#now I iterate again, this time to check for invalid input
Move:
addi $a0, $a0, 1 #iterates
j verify #goes to verification point
#first step of conversion, does the prerequisite work for translation
initial:
move $a0, $t2 #moves content
addi $t5, $t5, 0 #$t5 has 0 now
add $s0, $s0, $t0
addi $s0, $s0, -1 #decrement
#aqui empieza lo bueno
Must:
addi $sp, $sp, -16
sw $ra, 0($sp)
sw $ra, 4($sp)
sw $ra, 8($sp)
sw $ra, 12($sp)
jal Must
ExitMust:
lw $ra,16($sp)
lw $s4, 3($sp)
lw $s5, 2($sp)
lw $s6, 1($sp)
lw $s1, 0($sp)
jr $ra #return
#li $s4, 3 #each digit
#li $s5, 2
#li $s6, 1
#li $s1, 0
translate:
lb $s7, 0($a0) #loads digits
beqz $s7, final #final conversion step
beq $s7, $t1, final #if branch statement is true, move to final conversion statement
slti $t3, $s7, 58 #checks for less than or equal to 58
bne $t3, $zero, Base #OK to move forward if $t3 is not null
slti $t3, $s7, 88 #max for upper
bne $t3, $zero, Mari #OK to go to conversion of upper characters if $t3 is not null
slti $t3, $s7, 120 #max for lower
bne $t3, $zero, Mici #OK to go to conversion of lower characters if $t3 is not null
Base:
addi $s7, $s7, -48 #conversion for regular numbers
j row
Mari:
addi $s7, $s7, -55 #conversion for upper case
j row
Mici:
addi $s7, $s7, -87 #conversion for lower case
row: #determines which digit needs to be converted
beq $s0, $s4, one
beq $s0, $s5, two
beq $s0, $s6, three
beq $s0, $s1, last
#first character
one:
li $t6, 35937 #values to multiply by for the power of 3
mult $s7, $t6
mflo $t7
add $t5, $t5, $t7
addi $s0, $s0, -1
addi $a0, $a0, 1
j translate
#second character
two:
li $t6, 1089 #values to multiply by for the power of 2
mult $s7, $t6
mflo $t7
add $t5, $t5, $t7
addi $s0, $s0, -1
addi $a0, $a0, 1
j translate
#third character
three:
li $t6, 33 #values to multiply by for the power of 1
mult $s7, $t6
mflo $t7
add $t5, $t5, $t7
addi $s0, $s0, -1
addi $a0, $a0, 1
j translate
#fourth character
last:
li $t6, 1 #values to multiply by for the power of 0
mult $s7, $t6
mflo $t7
add $t5, $t5, $t7
#no more need to go back to translation step
final: #final step
li $v0, 1
move $a0, $t5 #moves content to $a0 so it can be printed
syscall
#last system call of the program will end program
end: #prints result
li $v0, 10
希望它会有所帮助,如果您需要,请在此处寻求进一步的解释,它是直接的从我的最后一年级工作和我的硕士中取出。
pd:它是在GPL下获得许可的,因此请谨慎对待您的工作,FBI可能正在寻找您。 爱:)