我一直在寻找通过一个C代码片段,当我遇到这行的汇编代码来:
char *buf = alloca(0x2000);
asm volatile("" :: "m" (buf));
Run Code Online (Sandbox Code Playgroud)
我不知道这意味着什么.在我的调查中,我了解到有许多不同类型的汇编语言(例如,MASM,NASM,GAS等),而在我(非常有限)的经验中,作者很少指定他们正在使用哪一种.
这条线意味着什么; 更重要的是,C开发人员(可能不精通大会)如何研究他们以这种方式遇到的汇编代码?
Pas*_*uoq 11
该片段既不是MASM,也不是GAS,NASM等.它是内联汇编,语法记录在C编译器的文档中.
即使您已熟悉纯装配,语法也很棘手,因为它必须指定如何将C零件与装配零件连接,反之亦然.
该语句asm volatile("" :: "m" (buf));通常是汇编的空位(不是noop而是实际缺少指令),这样的绑定指令"m"使得语句从C编译器的角度来看是一个内存屏障.
编辑:由StackOverflow上用户一个小丑,现在删除的答案在下面留言说,声明的目的是更容易避免buf,因而alloca呼叫,要由编译器通过假装汇编代码优化掉了""从中读取.
我相信C11标准提供了更清晰的表达记忆障碍的方法,但我还没有机会进行调查.无论如何,作为一种指定内存屏障的方法,上面的方法可以定位"GCC和编译器,目标是GCC兼容性,即使稍微过时"作为一组更大的编译器而不是"C编译器正确实现所有C11"标准".实际上,C11上的维基百科页面引用asm volatile ("" : : : "memory");了内存障碍的讨论.