我在互联网上找到了这个示例spim代码。
.data
COUNT: .word 10
TEXT: .asciiz "The number is "
EOL: .asciiz "\n"
.text
.globl main
main:
addiu $sp, $sp, -32 # Adjust stack
sw $ra, 24($sp)
sw $fp, 16($sp) # save old frame pointer
addiu $fp, $sp, 28 # load new frame pointer
la $t0, COUNT
lw $t1, 0($t0)
li $t0, 0 # init index to 0
loop:
sw $t0, 12($sp) # save caller saved registers
sw $t1, 8($sp) #
move $a0, $t0 # setup parameter for fn call
jal print_num # call subroutine
lw $t1, 8($sp) # restore caller saved values
lw $t0, 12($sp) #
addiu $t0, $t0, 1 # increment index;
blt $t0, $t1, loop #
lw $fp, 16($sp) # restore frame pointer
lw $ra, 24($sp) # restore return address
addiu $sp, $sp, 32 # restore stack pointer
jr $ra更新
我不能得到的是:如果函数main需要将四个寄存器保存到堆栈($ra、$fp、$t0、$t1),为什么它会为8个寄存器分配空间(32字节而不是16字节)?
耽误您时间,实在对不起
发布于 2011-04-13 04:53:19
帧指针应该指向堆栈的开始(底部)。因为堆栈元素是4个字节,所以底部元素的开始比堆栈的大小小4。
发布于 2011-04-13 04:32:13
这是由于使用了约定,特别是调用约定。在MIPS中,如果需要使用一些寄存器,calleé会将它们保存在堆栈上,需要保存的寄存器以及它们在堆栈中的保存位置是在一些约定中指定的。但是SGI IRIX有两种不同的约定,称为o32和n32 (代表“旧的”和“新的”),你可以在谷歌上搜索它们。
https://stackoverflow.com/questions/5638853
复制相似问题