汇编:需要在以下代码和一般情况下在内存堆栈中保存值

时间:2012-01-06 10:07:33

标签: assembly mips

我很乐意帮助解决以下问题。

我被要求实现函数is_cube,它接收n作为参数并在MIPS程序集中检查它是否是一个多维数据集。例如,8(2 ^ 3)和1000(10 ^ 3)是立方体。

我写了以下代码:

# UNTITLED PROGRAM

.data   

str: .asciiz "Please enter your number >"
str1: .asciiz "The number is a cube"
str2: .asciiz "The number is not a cube"


.text

 main:  

   li $v0 4
   la $a0 str
   syscall

   li $v0 5
   syscall


   move $t0 , $v0
   li $t1, 0
   blt $t0, $zero, negative


  negative:
    sub $t5, $zero, 1
mul $t0, $t0, $t5



 is_cube: 

  addi $t1, $t1, 1
  sgt $t2, $t1, $t0
  bne $t2, $zero, There_is_not 
  mul $t3, $t1, $t1
  mul $t4 ,$t3, $t1
  beq $t4, $t0, There_is

  jal is_cube



 There_is:

   li $v0 4
   la $a0 str1
   syscall

   jal end

 There_is_not:

   li $v0 4
   la $a0 str2
   syscall

   jal end


 end: 

并且它可以正常工作,而不会在$s0和所有这个过程中将$sp保存在堆栈中。我的问题是:没有保存它可以吗?如果是的话,我什么时候应该使用它?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您尚未实现某项功能。您已经实现了一个循环,恰好使用jal而不是普通的分支指令。执行从main开始,然后从negative开始到从is_cube开始的循环,然后当循环终止于There_isThere_is_not时,您使用jal end而不是另一个分支指令。

此代码发生以处理MIPS,因为jal指令不会将程序计数器的当前值推送到堆栈,与x86不同。

如果这是作业,在提交此代码之前,您应该回到有关在汇编程序中编写函数的注释。