【发布时间】:2023-03-18 16:05:02
【问题描述】:
我在这方面花了很多时间,我不得不同时使用整数和浮点来构建阿克曼函数
.data
askForM: .asciiz "Please enter a m value: "
askForN: .asciiz "Please enter a n value: "
result: .asciiz "The Result is: "
newline: .asciiz "\n"
.text
.globl main
main:
addi $sp, $sp, -16 # make stack.
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
la $a0, askForM # ask for m
li $v0, 4
syscall
li $v0, 5 # Read input
syscall
move $s0, $v0 # m = s2
la $a0, askForN # ask for n
li $v0, 4
syscall
li $v0, 5 # Read input
syscall
move $s1, $v0 # n = s1
# Ackermann parameter setup
move $a0, $s0 # m
move $a1, $s1 # n
# Call Ackerman
jal Ackermann
#----------Print-----------#
# m = $s0
# n = $s1
#move value
move $a2, $v0
addi $sp, $sp, -4 #make stack
sw $a0, 0($sp)
la $a0, result #The result is
li $v0, 4
syscall
move $a0, $a2 #Print value
li $v0, 1
syscall
la $a0, newline# newline
li $v0, 4
syscall
lw $a0, 0($sp) # restore
addi $sp, $sp, 4
lw $ra, 0($sp) # restore stack
lw $s0, 4($sp)
lw $s1, 8($sp)
lw $s2, 12($sp)
addi $sp, $sp, 16
# exit system call
li $v0, 10
syscall
#--------------------------------------Ackermann--
Ackermann: # make stack
addi $sp, $sp, -8
# save reg
sw $s0, 4($sp)
# save address
sw $ra, 0($sp)
misZero: # m==0
# if not check n
bne $a0, $zero, nisZero
# n+1
addi $v0, $a1, 1
j end #finish the call
nisZero: # check whether n==0 if not both are greater
bne $a1, $zero, bothGreater
#A(m-1,1)
#m-1 and 1
addi $a0, $a0, -1
addi $a1, $zero, 1
# Ackermann
jal Ackermann
j end
bothGreater:# Save m for second call
add $s0, $a0, $zero
#A(m,(n - 1))
addi $a1, $a1, -1
jal Ackermann
#A(m-1,A(m, (n - 1)))
addi $a0, $s0, -1
add $a1, $v0, $zero
jal Ackermann
j end
end: # restore
lw $s0, 4($sp)
# restore return address
lw $ra, 0($sp)
# restore stack pointer
addi $sp, $sp, 8
# return
jr $ra
这行得通,但我一辈子都无法让我的浮点双精度在这里工作,这就是我所拥有的。
.data
askForM: .asciiz "Please enter a m value: "
askForN: .asciiz "Please enter a n value: "
result: .asciiz "The Result is: "
newline: .asciiz "\n"
one: .double 1
negOne: .double -1
zero: .double 0
.text
.globl main
la $t1, one
l.d $f26, 0($t1)
la $t3, zero
l.d $f28, 0($t3)
la $t5, negOne
l.d $f24, 0($t5)
main:
addi $sp, $sp, -16 # make stack.
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
la $a0, askForM # ask for m
li $v0, 4
syscall
li $v0, 7 # Read input
syscall
mov.d $f16, $f0 # m = s2
la $a0, askForN # ask for n
li $v0, 4
syscall
li $v0, 7 # Read input
syscall
mov.d $f18, $f0 # n = s1
# Ackermann parameter setup
mov.d $f4, $f16 # m
mov.d $f6, $f18 # n
# Call Ackerman
mov.d $f2, $f0 #$V0
jal Ackermann
#----------Print-----------#
# m = $s0
# n = $s1
#move value
mov.d $f12, $f2
addi $sp, $sp, -4 #make stack
sw $a0, 0($sp)
la $a0, result #The result is
li $v0, 4
syscall
#move $a0, $a2 #Print value
li $v0, 3
syscall
la $a0, newline# newline
li $v0, 4
syscall
l.d $f4, 0($sp) # restore
addi $sp, $sp, 4
lw $ra, 0($sp) # restore stack
lw $s0, 4($sp)
lw $s1, 8($sp)
lw $s2, 12($sp)
addi $sp, $sp, 16
# exit system call
li $v0, 10
syscall
#--------------------------------------Ackermann-
Ackermann: # make stack
addi $sp, $sp, -16
# save reg
swc1 $f16, 8($sp)
# save address
sw $ra, 0($sp)
#$f24 = -1
#$f26 = 1
#f28 = 0
misZero: # m==0
# if not check n
c.le.d $f4, $f28
bc1f nisZero
# n+1
add.d $f2, $f6, $f26
j end #finish the call
nisZero: # check whether n==0 if not both are greater
c.le.d 1 $f6, $f28
bc1f 1 bothGreater
#A(m-1,1)
#m-1 and 1
add.d $f4, $f4, $f24
add.d $f6, $f28, $f26 #simplified this
# Ackermann
jal Ackermann
j end
bothGreater:# Save m for second call
add.d $f16, $f4, $f28
#A(m,(n - 1))
add.d $f6, $f6, $f24
jal Ackermann
#A(m-1,A(m, (n - 1)))
add.d $f4, $f16, $f24
add.d $f6, $f2, $f28
jal Ackermann
j end
end: # restore
lwc1 $f16, 8($sp)
# restore return address
lw $ra, 0($sp)
# restore stack pointer
addi $sp, $sp, 16
# return
jr $ra
谁能帮我看看我做错了什么?
【问题讨论】:
-
它会崩溃吗?输出错了吗?你可以更具体一点。您还使用什么执行环境(看起来像 SPIM)?是打印 N 而不是结果的问题吗?
-
我得到了错误的结果。让我看看印刷的想法。我正在使用 MARS 。只是给我不正确的结果并没有崩溃。
-
我看不到在哪里打印 N 而不是值。
-
你能说得再模糊点吗?你到底在输入什么,输出什么,你期待什么?
-
我想我可能会更模糊,但我不知道这会有什么帮助。别担心,我自己想通了。就像我说的,这是自 1928 年以来一直存在的 Ackermann 函数。我接受两个数字并吐出递归计算。如果我要列出所有可能的输入和输出,我将很快接近无穷大。