【问题标题】:Confusion in gcc switch case assemblygcc开关盒组装中的混乱
【发布时间】:2019-04-25 02:30:38
【问题描述】:

我的 Prog.c 包含一个简单的 switch case,如下所示:

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

我不明白为什么会这样?

【问题讨论】:

  • 向我们展示输出可能很有用。目前您可以简单地执行if (x>=1 && x<=5) p=x+1; 或跳转到从x 计算的地址。如果您的案例列表中有空白,则此方法无效。
  • 编译器优化决定使用间接跳转而不是多重比较。

标签: c


【解决方案1】:

这是因为Branch Tables 而发生的。避免它与

一起编译

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多