1

我正在尝试创建的是调用 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
4

1 回答 1

0

那么有这样的事情吗?

unsigned short a __at((0x100)) = 1;

int main()
{
   asm (
       "btsts %0, #2\n"
       : "+m" (a)
   );
   return a;
}

使用 xc16-gcc -mcci -O1 -mcpu=30F4011 -S mc 构建

_main:
        .set ___PA___,0
        btsts   _a, #2

        mov     _a,w0
        return
于 2019-01-24T06:16:43.017 回答