c - 编译器生成的汇编文件中的 "#APP"是什么意思?

标签 c gcc assembly directive inline-assembly

我写了下面的代码:

// a.c
#include <stdlib.h>
#include <sys/syscall.h>
#include <unistd.h>

_Noreturn void _start()
{
    register int syscall_num asm ("rax") = __NR_exit;
    register int exit_code   asm ("rdi") = 0;

    // The actual syscall to exit
    asm volatile ("syscall"
        : /* no output Operands */
        : "r" (syscall_num), "r" (exit_code));
}

然后使用 clang-7 -Oz -pipe -flto -c a.c 编译它并使用 llc-7 -filetype=asm a.o 将它变成人类- 可读的汇编文件a.o.s:

    .text
    .file   "a.c"
    .globl  _start                  # -- Begin function _start
    .type   _start,@function
_start:                                 # @_start
    .cfi_startproc
# %bb.0:
    pushq   $60
    .cfi_adjust_cfa_offset 8
    popq    %rax
    .cfi_adjust_cfa_offset -8
    xorl    %edi, %edi
    #APP
    syscall
    #NO_APP
    retq
.Lfunc_end0:
    .size   _start, .Lfunc_end0-_start
    .cfi_endproc
                                        # -- End function

    .ident  "clang version 7.0.1-svn348686-1~exp1~20181211133235.57 (branches/release_70)"
    .section    ".note.GNU-stack","",@progbits

在上面的程序集中,指令#APP出现在syscall之前,这是我写的程序集,指令#NO_APP出现在右边之后。

我知道它一定与 asm 的使用有关,比如防止它被优化掉,但我在谷歌搜索后找不到它的任何文档。

感谢先进。

最佳答案

至少从历史上看,编译器告诉 as 它可以使用快速解析模式来解析纯编译器输出,然后切换回完全解析来自 inline-asm 的 block 。进入此模式的文件中应该有一个#APP#NO_APP 退出此模式。

我不确定 as 是否再根据该提示执行任何操作,因此它甚至可能根本不会查找 #NO_APP,而只是像对待任何其他评论一样对待它.

在实践中,它分隔来自内联 asm 模板的文本 block 与编译器生成的 asm。除此之外,它什么都不做,如果您出于某种原因手动编辑 asm,完全可以删除它。

关于c - 编译器生成的汇编文件中的 "#APP"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53959565/

相关文章:

c - C90 和 C99 中复合类型对象的对齐

c++ - 在 gcc 中执行 C++98 标准

c++ - 没有从 "std::allocator"到 "const allocator_type"的转换

c - 质数元素的合并排序?

c - 如何借助 fscanf 找出矩阵中列的大小?

c - 多次发送,多次接收

c++ - 带有可变模板参数的部分特化,后跟其他参数

ios - 如何将 Xcode arm64 编译器输出视为汇编语言?

assembly - 使用 cmpq 和 je 时的无限循环

循环中的 C asm linux 系统调用永远继续