我想知道在单个函数中,当我通过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
答案 0 :(得分:0)
首先,如果要调用函数,请使用jump而不是branch。分支通常用于ifs,whiles等。有专门为此目的而设置的jalr
(跳转和链接寄存器)等特殊跳转指令,因为它将返回地址存储在$ra
中(因此您可以从函数返回 )。
截至您的问题,您当然可以访问。堆栈只是一个内存区域。但你所做的实际上是将参数传递给函数。 MIPS ABI声明这应该通过$aX
寄存器而不是堆栈来完成。
编辑:我看到你对堆栈感到困惑。有关MIPS中堆栈的更多详细信息,请参阅this(在其他架构中它也非常相似)。