相关疑难解决方法(0)

编译器如何在 ARM 汇编中强制执行 C++ 易失性

根据 cppreference,一个volatile限定变量的存储不能重新排序为另一个volatile限定变量。换句话说,在下面的示例中,当 y 变为 20 时,可以保证 x 为 10。

volatile int x, y;
...
x = 10;
y = 20;
Run Code Online (Sandbox Code Playgroud)

根据维基百科,ARM 处理器的一个存储可以在另一个存储之后重新排序。因此,在下面的示例中,第二个存储可以在第一个存储之前执行,因为两个目的地是不相交的,因此它们可以自由地重新排序。

str     r1, [r3]
str     r2, [r3, #4]
Run Code Online (Sandbox Code Playgroud)

有了这样的理解,我写了一个玩具程序:

volatile int x, y;

int main() {
    x = 10;
    y = 20;
}
Run Code Online (Sandbox Code Playgroud)

我预计生成的程序集中会出现一些围栏,以保证 x 和 y 的存储顺序。但为 ARM生成的程序集是:

main:
        movw    r3, #:lower16:.LANCHOR0
        movt    r3, #:upper16:.LANCHOR0
        movs    r1, #10
        movs    r2, #20
        movs    r0, #0
        str     r1, [r3]
        str     r2, [r3, #4] …
Run Code Online (Sandbox Code Playgroud)

c++ assembly arm volatile memory-barriers

1
推荐指数
1
解决办法
587
查看次数

标签 统计

arm ×1

assembly ×1

c++ ×1

memory-barriers ×1

volatile ×1