2011-04-12 33 views
4

我發現這個樣本SPIM代碼在互聯網上樣品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 

UPDATE
什麼我不能得到的是:如果 函數main需要四個寄存器保存到堆棧($ RA $ FP $ t0 $ t1),它如何爲8個寄存器(32個字節而不是16個字節)分配空間?

感謝您的時間

回答

2

這是由於使用的公約,特別是調用約定。在MIPS中,如果需要使用它們,calleé將堆棧上的某些寄存器保存在堆棧中,哪些寄存器需要保存,堆棧中保存的位置在某些約定中指定。關於SPIM的IDK,但SGI IRIX有兩個不同的約定,分別叫做o32n32(對於「舊」和「新」),你可能會有一些運氣在搜索它們。

3

幀指針應指向堆棧的開始(底部)。由於堆棧元素爲4個字節,因此底部元素的起始位置比堆棧的大小小4個。