0

我想知道在单个函数中,当我通过 beq 或 bne 去其他地方时,会创建一个新堆栈,或者因为我仍在同一个函数中,所以我的堆栈继续存在?让我通过一个例子来解释我的问题。在测试部分之前,我已经将 $t3 的内容放入堆栈中,并且在进行测试之后我想达到它。这可能吗?提前致谢

   main:
       addi $sp, $sp, -1
       sb $t3,($sp)       #t3 stores value 1 and I stored it into stack by this line
       beq $t1 $t2 test   #assume it holds


   test:
      lb $t7,($sp)        # now I want to take 1 into $t7 here.Is it possible ??
      addi $sp, $sp, 1
      la $t7,($a0)
      li $v0,4 
      syscall 
      li $v0,10
      syscall
4

1 回答 1

0

首先,如果要调用函数,请使用跳转而不是分支。分支通常用于 ifs、whiles 等。有特殊的跳转指令,例如jalr(跳转和链接寄存器)专门为此目的而设计,因为它将返回地址存储在其中$ra(因此您可以从函数返回)。

至于你的问题,你当然可以访问。堆栈只是一个内存区域。但是您所做的实际上是将参数传递给函数。MIPS ABI 声明这应该通过$aX寄存器而不是堆栈来完成。

编辑:我看到你对堆栈感到困惑。有关MIPS 中堆栈的更多详细信息,请参阅此内容(在其他架构中也非常相似)。

于 2013-11-03T22:34:46.177 回答