我在互联网上找到了这个示例 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 字节)分配空间?

谢谢你的时间

最佳答案

帧指针应指向堆栈的开头(底部)。由于堆栈元素是 4 个字节,因此底部元素的开头比堆栈的大小小 4。

关于assembly - 样本 spim 代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5638853/

10-12 23:57