编译器生成的汇编文件中的“ #APP”是什么意思?

时间:2018-12-28 13:47:02

标签: 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出现在它之后。

我知道它必须与$webhook = new AuthnetWebhook('14FE4A2385812E980CCF97D177F17863CE214D1BE6CE8E1E894487AACF3609C1A5FE1752CB4A002C634B84E397DC8A218E1A160BA7CAB7CBE4C05B35E9CBB05E', $payload); 的使用有关,以防止其被优化,但是在谷歌搜索之后我找不到任何文档。

谢谢。

2 个答案:

答案 0 :(得分:4)

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

我不确定as对该提示是否有任何帮助,因此它甚至可能根本不会寻找#NO_APP,只是将其像其他评论一样对待。

在实践中,它与内联asm模板(与编译器生成的asm相比)来分隔文本块。除此以外,它什么也没做,如果您出于某种原因手动编辑汇编,则完全可以将其删除。

答案 1 :(得分:0)

它将删除空格以及它与#NO_APP之间的注释。

在这种情况下,将其放置在此处以防万一,因为您在asm()中有注释