首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >示例spim代码

示例spim代码
EN

Stack Overflow用户
提问于 2011-04-13 00:52:06
回答 2查看 1.1K关注 0票数 4

我在互联网上找到了这个示例spim代码。

代码语言:javascript
复制
.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字节)?

耽误您时间,实在对不起

EN

回答 2

Stack Overflow用户

发布于 2011-04-13 04:53:19

帧指针应该指向堆栈的开始(底部)。因为堆栈元素是4个字节,所以底部元素的开始比堆栈的大小小4。

票数 3
EN

Stack Overflow用户

发布于 2011-04-13 04:32:13

这是由于使用了约定,特别是调用约定。在MIPS中,如果需要使用一些寄存器,calleé会将它们保存在堆栈上,需要保存的寄存器以及它们在堆栈中的保存位置是在一些约定中指定的。但是SGI IRIX有两种不同的约定,称为o32n32 (代表“旧的”和“新的”),你可以在谷歌上搜索它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5638853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档