【问题标题】:What's the meaning of '#x.x' in assemble copiled by icc?icc编译的程序集中'#x.x'是什么意思?
【发布时间】:2019-09-21 10:48:00
【问题描述】:

我用 intel icc 编译器编译了一些简单的代码,我注意到每行末尾都有一些数字。我想知道是什么意思。

就像下面代码中的#3.12

#include <stdio.h>

int main() {
    int a = 3, b;
    scanf("%d", &b);
    a = a + b;
    printf("Hello, world! I am %d\n", a);
    return 0;
}
...
main:
..B1.1:                         # Preds ..B1.0
                                # Execution count [1.00e+00]
..L1:
                                                          #3.12
        pushl     %ebp                                          #3.12
        movl      %esp, %ebp                                    #3.12
        andl      $-128, %esp                                   #3.12
...

【问题讨论】:

  • 对应C代码的行列号? ICC 手册中提到了一些称为“#line 指令,编译器使用它来确定源文件和行号”。但据我所知,它没有指定这些指令的格式。
  • @Michael 你是对的,也是错的。数字是对应代码的行列,但和#line directive没有直接关系,__LINE____FILE__编译时用来手动设置内部宏的值(间接关系在使用#line 指令设置行号的方式将影响程序集输出中显示的行号)。

标签: c intel icc


【解决方案1】:

确实是对应源码的行列。 #3.12 是主函数的开头{,这是有道理的,因为显示的语句与函数的开头是一致的。

如果您在{ 之前插入一个额外的空格,您将看到输出更改为#3.13;同样,如果您在 main() 函数之前插入一个空行,3 将更改为 4

【讨论】:

    【解决方案2】:

    这是准备函数开始的过程,也称为函数头。这里我们将返回地址隐藏在堆栈上,并在堆栈上分配空白空间以供函数工作。注意最后是逆过程。这是另一个编译器的相同示例:

            push    ebp
            mov     ebp, esp
            sub     esp, 8
            ...
            mov     esp, ebp
            pop     ebp
            ret     0
    

    【讨论】:

    • OP 询问的是 ICC 如何为其 cmets 选择数字,而不是这些行中的说明实际执行的操作。
    • 对不起?我不理解他
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2017-04-20
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多