2011-04-12 6 views
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 

UPDATE
내가 무엇을 얻을 수없는 것은 : 기능의 주요 요구는 스택 ($의 라 $의 FP에 4 개 개의 레지스터를 저장하는 경우 $ t0 $ t1), 어떻게 8 개의 레지스터 (16 바이트 대신 32 바이트)에 공간을 할당합니까? 이 규칙를 호출 특히 에, 컨벤션의 사용으로 인해 시간

답변

2

에 대한

감사합니다. MIPS에서 calleé는 레지스터를 사용해야 할 경우 스택에 일부 레지스터를 저장합니다. 레지스터는 저장이 필요하고 스택에 저장되는 위치는 규칙에 따라 지정됩니다. SPIM에 관한 IDK, SGI IRIX는 o32n32 ("구형"및 "신규"용)의 두 가지 관례를 사용하고 있습니다.

3

프레임 포인터는 스택의 시작 (하단)을 가리켜 야합니다. 스택 요소가 4 바이트이기 때문에 맨 아래 요소의 시작은 스택 크기보다 4 작습니다.