繁体   English   中英

在GCC内联汇编中使用数组元素作为输出存储约束时,为什么需要指定“内存”破坏者?

Why does “memory” clobber need to be specified when using array element as an output memory constraint in GCC's inline asm?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试对音频编解码器进行一些asm级别(具有DSP扩展的MIPS)优化。 我需要进行一些DSP处理,然后才需要将结果存储回阵列中。 这是我认为应该执行的代码:

asm(
    eDSP_MFLO(8, 1) // move the accumulated result to $8
    "sw $8, %0\n"   // result => array
    : "=m"(s[i])
    :: "$8"
);

问题在于此代码是否有效(取决于它的周围代码,我会在数组中发现垃圾),除非我在“ Clobber”列表中添加了“内存”:

asm(
    eDSP_MFLO(8, 1) // move the accumulated result to $8
    "sw $8, %0\n"   // result => array element s[i]
    : "=m"(s[i])
    :: "$8", "memory"
);

我很难理解为什么有必要。 如果我本人将asm块中的偏移量计算为数组,这样编译器将不知道已更改了哪些内存地址,我将不会对此提出质疑,但是由于GCC本身是在执行这些步骤,所以为什么它需要额外的“内存” clo?

1 个回复

看一下在有和没有"memory"约束的情况下为整个函数生成的汇编代码(使用gcc -S ... )。 看起来gcc在寄存器中有s[i]的副本,该副本是在asm()语句之前从内存中加载的,除非您添加,否则它不会意识到该寄存器包含asm()语句之后的过期信息。 "memory"约束。

1 在 GCC 内联汇编中影响内存操作数寻址模式的早期破坏者的不正确行为的具体示例?

以下摘自GCC 手册的 Extended Asm docs ,关于使用asm关键字在 C 中嵌入汇编指令: 如果一个输出参数 ( a ) 允许寄存器约束而另一个输出参数 ( b ) 允许内存约束,则会出现同样的问题。 GCC 生成的用于访问b 中的内存地址的代码可以包含可能由a共享的寄存器, ...

2 GCC内联asm:直接内存引用的约束

我需要GCC为内联asm生成一组一致的指令,但我正在使用的一条指令有时会以两种不同的方式编译: 编译#1: 编译#2: 我不确定第二个版本的原因是什么,但我不想要它。 是否有约束来指定内存引用应该只是直接的,即不通过寄存器? 更新: 这种变化总是产生完全相 ...

4 内联 asm 编译器屏障(内存破坏)算作外部函数还是静态函数调用?

介绍/确认基本事实 众所周知,使用 GCC 风格的 C 和 C++ 编译器,您可以使用带有“内存”clobber 的内联汇编: 防止重新排序(大多数)代码通过它,充当(线程本地)“内存屏障”(例如用于与异步信号交互的目的)。 注意:这些“编译器障碍”不完成线程间同步。 它相当于调用非内联函数 ...

8 不使用变量地址时,为什么GCC会重新排列内存?

所以我在C语言中遇到了这个非常奇怪的事情。这是我的源代码: 这只是一个简单的程序,可以在内存较高的地址中打印可打印的字节。 预期仅打印“ L”。 但是那没有发生。 它打印出“ BAZL”。 但是当我像这样返回之前访问这些内存地址时 它突然起了应有的作用。 由于堆栈朝着较 ...

2017-08-25 01:04:13 0 84   c/ gcc
9 避免在访问内存时刷新寄存器(gcc inline asm)

在GCC手册的“ 6.43.2.5扩展Asm-Clobbers”一节中 ,在“内存” Clobber的说明中,提到了避免刷新寄存器的技巧: 如果您知道在编译时正在访问的内存大小,则可以指定这样的内存输入: (假设您访问的是10个字节的字符串。) 我想我了解这个主意, ...

10 为什么GCC产生以下asm输出?

我不明白为什么gcc -S -m32产生这些特定的代码行: 我的问题是为什么%eax被推,然后弹出? 为什么movl用来代替pushl和popl分别? 它更快吗? 是否有一些我还不知道的编码约定? 我刚刚开始密切关注asm-output,所以我不太了解。 C代码: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM