我给出了有问题的代码,并且堆栈的使用可能无效..
任何人都可以告诉我解决这个问题吗?
.data
.align 2
array:.space 100
.text
.globl main
main:
li $t0,10
addi $sp,$sp,-12 #stack
sw $ra,0($sp)
sw $s0,4($sp)
sw $s1,8($sp)
jal function
addi $sp,$sp,12
lw $ra,0($sp) #hello stack
lw $s0,4($sp)
lw $s1,8($sp)
li $v0,1
add $a0,$t6,$0
syscall
li $v0,10
syscall
function:
move $s0,$a2
move $s1,$a1
li $s0,10101 # s0,s1 dont change itsvalues NEVER
li $s1,20202
li $t6,777
move $v0,$t6
jr $ra
答案 0 :(得分:1)
您是否听说过MIPS处理器中的“延迟插槽”? 任何“分支”指令之后的下一条指令放在“延迟槽”中。这意味着即使执行了分支,也会执行该指令。所以在下一段代码中:
jal function
addi $sp,$sp,12
您需要在nop
之后放置jal
指令,因为addi
会在通话后立即执行,但不会在function
返回后执行。它也驻留在jr
指令。