gpt4 book ai didi

c - C 开发人员如何使用对他们来说陌生的汇编?

转载 作者:太空狗 更新时间:2023-10-29 14:54:01 26 4
gpt4 key购买 nike

我正在浏览 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com