4

インターネットでこのサンプル スピコードを見つけました

.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 が 4 つのレジスタをスタック ($ra $fp $t0 $t1) に保存する必要がある場合、どうして 8 つのレジスタ (16 バイトではなく 32 バイト) にスペースを割り当てるのですか?

御時間ありがとうございます

4

2 に答える 2

3

フレーム ポインターは、スタックの最初 (一番下) を指す必要があります。スタック要素は 4 バイトであるため、一番下の要素の開始位置はスタックのサイズよりも 4 少なくなります。

于 2011-04-12T20:53:19.110 に答える
2

これは、規約、特に呼び出し規約の使用によるものです。MIPS では、呼び出し先は、使用する必要がある場合にいくつかのレジスターをスタックに保存します。どのレジスターを保存する必要があり、それらが保存されるスタック内の場所は、何らかの規則で指定されます。SPIM については IDK ですが、SGI IRIX にはo32n32(「古い」と「新しい」を表す) と呼ばれる 2 つの異なる規則がありました。

于 2011-04-12T20:32:13.247 に答える