high memory +------------------------+ | .... | | .... | virtual frame | argument n | pointer $(fp) ->/+------------------------+\ / | | \ frame offset | local & temporaries | \ \ | | \ \+------------------------+ \ | saved registers | frame size | (including returnreg) | / +------------------------+ / | .... | / stack | argument build | / pointer $(sp) -> +------------------------+/ (framereg) | .... | | .... | | | | | | | low memory +------------------------+
.frame framereg, framesize, returnreg
The virtual frame pointer is a frame pointer as used in other compiler systems but has no register allocated for it. It consists of the framereg ($sp, in most cases) added to the framesize. The returnreg specifies the register containing the return address (usually $ra).
.mask bitmask, frameoffset
The .mask directive specifies the registers to be stored and where they are stored. A bit should be on in bitmask for each register saved (for example, if register $31 is saved, bit 31 should be ‘1’ in bitmask. Bits are set in bitmask in little-endian order, even if the machine configuration is big-endian).The frameoffset is the offset from the virtual frame pointer (this number is usually negative).
.fmask bitmask, frameoffset
Notice that saving floating-point registers is identical to saving general registers except we use the .fmask pseudo-op instead of .mask, and the stores are of floating-point singles or doubles.
.text
.cfi_sections .debug_frame
.align 2
.globl main
.cfi_startproc
.ent main
.type main, @function
main:
.frame $fp,32,$31 # vars= 16, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-8
.fmask 0x00000000,0
.set noreorder
.set nomacro
daddiu $sp,$sp,-32
.cfi_def_cfa_offset 32
sd $fp,24($sp)
.cfi_offset 30, -8
move $fp,$sp
.cfi_def_cfa_register 30
move $2,$4
sd $5,8($fp)
sll $2,$2,0
sw $2,0($fp)
.loc 1 6 12
move $2,$0
.loc 1 7 1
move $sp,$fp
.cfi_def_cfa_register 29
ld $fp,24($sp)
daddiu $sp,$sp,32
.cfi_restore 30
.cfi_def_cfa_offset 0
jr $31
nop
.set macro
.set reorder
.end main
.cfi_endproc
.size main, .-main
References
From: http://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf