编译器生成的汇编文件中的“#APP”是什么意思?
What does "#APP" in the assembly file generated by compiler mean?
我写了下面的代码:
// 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
.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
的使用有关,比如防止它被优化掉,但谷歌搜索后我找不到任何文档。
感谢先进。
它删除了空格和它与#NO_APP之间的注释。
在这种情况下,它被放置在这里以防万一您在 asm()
中有评论
至少从历史上看,编译器告诉 as
它可以使用快速解析模式来解析纯编译器输出,然后切换回完全解析来自内联 asm 的块。进入此模式的文件中应该有一个 #APP
开头的地方。 #NO_APP
退出此模式。
我不确定 as
是否再根据该提示执行任何操作,因此它甚至可能根本不会查找 #NO_APP
,就像对待任何其他评论一样对待它。
实际上,它分隔来自内联 asm 模板的文本块,与编译器生成的 asm。除此之外,它什么都不做,如果您出于某种原因手动编辑 asm,完全可以删除它。
我写了下面的代码:
// 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
.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
的使用有关,比如防止它被优化掉,但谷歌搜索后我找不到任何文档。
感谢先进。
它删除了空格和它与#NO_APP之间的注释。
在这种情况下,它被放置在这里以防万一您在 asm()
中有评论至少从历史上看,编译器告诉 as
它可以使用快速解析模式来解析纯编译器输出,然后切换回完全解析来自内联 asm 的块。进入此模式的文件中应该有一个 #APP
开头的地方。 #NO_APP
退出此模式。
我不确定 as
是否再根据该提示执行任何操作,因此它甚至可能根本不会查找 #NO_APP
,就像对待任何其他评论一样对待它。
实际上,它分隔来自内联 asm 模板的文本块,与编译器生成的 asm。除此之外,它什么都不做,如果您出于某种原因手动编辑 asm,完全可以删除它。