我正在尝试创建的是调用 BTSTS 指令的高级方法。
到目前为止我尝试了什么:
volatile unsigned int a = 1;
asm volatile(
"btsts %0, #2\n"
: "+d" (b)
:
: "cc"
);
以上产生以下汇编输出:
mov #1,w0
mov w0,[w14]
mov [w14],w0
mov w0,w1
btsts w1, #2
mov w1,w0
mov w0,[w14]
但这不是我想要的。该位应直接在内存中设置,以便指令是原子的:
btsts [w0], #2
完成它的正确方法是什么?
最接近的方法如下:
这里的“a”是一个全局变量而不是一个局部变量
asm volatile(
"btsts [%0], #2\n"
:
: "d" (&a)
: "cc"
);
这次生成以下汇编输出:
mov _a,w0
mov w0,w1
btsts [w1], #2
它好一点,但是我不想明确指定它周围的大括号 [%0]。编译器/汇编器没有办法知道需要间接内存寻址吗?
编辑:我又尝试了一件事。尽管文档中没有提到“m”约束,但我尝试了它
volatile unsigned int r = 0;
void test(volatile unsigned int* t) {
asm (
"btsts %0, #2\n"
: "+m" (t)
);
}
上面会产生类似的东西
mov #_r,w0
...
mov w0,[w14]
btsts [w14], #2
这也是不正确的,不会改变r
。也许没有提到“m”约束,因为它是错误的?
顺便提一句。正确的代码是
btsts [w0], #2
或类似的东西
mov w0,[w14]
mov [w14],w1
btsts [w1], #2