пример спим-кода - PullRequest
       13

пример спим-кода

4 голосов
/ 12 апреля 2011

Я нашел этот пример спим-кода в интернете

.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 байтов)?

спасибо за ваше время

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Указатель кадра должен указывать на начало (низ) стека.Поскольку элементы стека имеют размер 4 байта, начало нижнего элемента на 4 меньше размера стека.

2 голосов
/ 13 апреля 2011

Это связано с использованием соглашения, в частности соглашения о вызовах . В MIPS вызываемый объект сохраняет некоторые регистры в стеке, если ему нужно их использовать, какие регистры нужно сохранить и где в стеке они сохранены, указано в некоторых соглашениях. IDK о SPIM, но в SGI IRIX было два разных соглашения: o32 и n32 (для «старого» и «нового»), вам, возможно, повезет, что они ищут их.

...