解释编译器生成的程序集

时间:2017-10-30 15:56:25

标签: assembly mips compiler-optimization

我正在尝试理解将简单的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个字节?)。

0 个答案:

没有答案