Я новичок в MIPS и пытаюсь выяснить возвращаемые значения во вложенных функциях. Я пытаюсь выяснить, почему в функции test
, когда я загружаю $ra
из стека, она переводит меня в инструкцию после вызова функции calcs
в main
вместо инструкции после jal test
в calcs
функция? Создан ли новый стек для каждой функции?
Когда я нахожусь в функции test
, у меня должно быть 2 $ra
значений в стеке, и когда я загружаю последнее значение в $ra
, это должно быть один, чтобы вернуть меня к инструкции после jal test
в calcs
функции, но этого не происходит, и я не могу понять, почему.
.data
newline: .asciiz " XXXX "
.text
main:
addi $s0, $0, 39 # val 1
addi $s1, $0, 2 # val 2
addi $s2, $0, 14 # val 3
addi $s3, $0, 11 # val 4
add $a0, $0, $s0 # copy val 1 to $a0
add $a1, $0, $s1 # copy val 2 to $a1
jal calcs
add $s4, $0, $v0 # move returned value to $s4
# Exit program
li $v0, 10 # system call to exit program
syscall
calcs:
addi $sp, $sp, -4 # make space in stack
sw $ra, 0($sp) # add $ra value to stack
add $t8, $s0, $a0 # save arg $a0 to $t8
add $t9, $s0, $a1 # save arg $a1 to $t9
jal test
add $t0, $0, $v0 # move returned value to $t0
add $a0, $0, $v0 # move returned value to $a0
# print
li $v0, 1
syscall
li $v0, 4
la $a0, newline
syscall
# get value from stack
addi $sp, $sp, 4
lw $ra, 0($sp)
add $v0, $0, $t0
jr $ra
test:
addi $sp, $sp, -4 # make space in stack
sw $ra, 0($sp) # push $ra value to stack
add $t0, $0, -989898989
add $v0, $0, $t0
#### If I keep the two lines below then the $ra value jumps to be right after I call the calcs function in main. But if I remove it then it goes to the value right after I call the test function in calcs
lw $ra, 0($sp) # load $ra value from stack
addi $sp, $sp, 4 # pop value off stack
# printing
add $a0, $0, $t0
li $v0, 1
syscall
li $v0, 4
la $a0, newline
syscall
add $v0, $0, $t0 # copy $t0 value to $v0 again
jr $ra