- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在浏览 a C
code snippet当我遇到这行汇编代码时:
char *buf = alloca(0x2000);
asm volatile("" :: "m" (buf));
我不知道这是什么意思。在我的调查中,我了解到有许多不同类型的汇编语言(例如 MASM、NASM、GAS 等),并且根据我(非常有限)的经验,作者很少指定他们使用的是哪一种.
这行是什么意思;更重要的是,C
开发人员(大概不精通汇编)如何研究他们以这种方式遇到的汇编代码?
最佳答案
该片段既不是 MASM、GAS、NASM 等。它是 inline assembly , 语法记录在 C 编译器的文档中。
即使您已经熟悉纯汇编,语法也很棘手,因为它必须指定如何将 C 部分与汇编部分连接起来,反之亦然。
语句 asm volatile(""::"m"(buf));
通常是汇编的一个空位(不是 noop,而是实际上没有指令),具有这样的绑定(bind)指令 "m"
使语句达到 memory barrier从 C 编译器的角度来看。
编辑:StackOverflow 用户 Jester 在现已删除的答案下方的评论说,该语句的目的更有可能阻止 buf
,从而阻止 alloca
调用, 由编译器通过假装汇编代码 ""
从中读取来优化。
我相信 C11 标准提供了更清晰的方式来表达内存障碍,但我还没有机会进行调查。无论如何,作为一种指定内存屏障的方法,上述方法可以将“GCC 和旨在实现 GCC 兼容性的编译器,即使稍微老一点”作为比“正确实现所有 C11 的 C 编译器”更大的编译器集。标准”。实际上,C11 上的维基百科页面引用了 asm volatile (""::: "memory");
作为讨论内存屏障的示例。
关于c - C 开发人员如何使用对他们来说陌生的汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614125/
我是一名优秀的程序员,十分优秀!