我正在尝试理解将简单的C代码转换为汇编MIPS。
int main(){
int a;
a = 9;
return 0;
}
正在翻译成
main:
.frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-16
sw $fp,12($sp)
move $fp,$sp
li $2,9 # 0x2
sw $2,0($fp)
move $2,$0
move $sp,$fp
lw $fp,12($sp)
addiu $sp,$sp,16
jr $31
nop
我觉得使用$ fp和$ sp有点奇怪:在我看来,有不必要的备份和恢复。可能只是编译器转换为汇编的方式。
但我无法理解为什么它在堆栈上保留16个字节:4个用于本地变量,4个用于$ fp备份...以及其他8个字节? 我在谈论MIPS,我正在使用gcc和toolchain mips-mti-elf。
我修改了代码,现在变量是全局的。你猜怎么着?堆栈大小是8个字节($ fp为4,但其他4个字节?)。