【问题标题】:Mips Ackermann function in floating point浮点中的 Mips Ackermann 函数
【发布时间】: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 函数。我接受两个数字并吐出递归计算。如果我要列出所有可能的输入和输出,我将很快接近无穷大。

标签: assembly mips


【解决方案1】:

如果您将 swc1 和 lwc1 更改为 s.d 和 l.d,则该功能有效。菜鸟错误,欢迎各位初学者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多