gcc开关盒组装中的混乱

时间:2018-11-22 11:50:26

标签: c

我的Prog.c包含一个简单的开关盒,如下所示:

switch (x)
{
    case 1:
        p=2;
        break;
    case 2:
        p=3;
        break;
    case 3:
        p=4;
        break;
    case 4:
        p=5;
        break;
    case 5:
        p=6;
        break;
    default:
        break;
}

我用以下程序编译了该程序

gcc -g -v prog.c

并使用

创建objdump
objdump -S -l a.out>dump_file

对于switch case语句,我发现已经创建了一个间接分支(jmp *%eax)。

但是,如果我删除任何一条case语句,则不会创建任何间接分支。

gcc版本5.4.0

我不明白为什么会这样?

1 个答案:

答案 0 :(得分:0)

发生这种情况是由于Branch Tables。避免使用

进行编译

gcc -g -v -fno-jump-tables SO.c

如果使用跳转表进行编译[gcc编译器中的一项功能],dump_file的大小为:9,965字节

但没有它,大小为:11,493字节。

跳转表可通过优化和重新定位一些跳转指令来帮助减少目标代码的大小。