我喜欢做一些优化,所以我喜欢用两行汇编程序代替一行c代码。
rb->am += N
ringbuffer 结构体
rb
通过变量 N
递增
我正在努力让汇编正确。这是我的伪代码
void myFunc(struct rb, const uint16_t N)
...
asm(
"mov w0, %0\n"
"add %1, w0"
: rb->am
: N
: w0
);
如果我理解 asm 关键字它
asm(<instruction> : <input operants> : <output operants> : <clobbers>)
我目前不知道如何使语法正确。
W0 是寄存器。我认为我需要告诉我的编译器我正在使用它。
rb->am 需要解析为内存地址。
N 是函数参数(如 rb)。
知道如何解决这个问题吗?
[更新] 目标平台是 microchip 的 dspic33。我查了一下程序员手册。唯一改变 RAM 中 uint16 变量的 ADD 是针对 W0/WREG 的。
ADD f {,WREG} -> Destination = f + WREG
像(我的伪代码)
MOV WREG, N
ADD addr(rb->am)
是需要的。 这是我的来源的链接 https://ww1.microchip.com/downloads/en/DeviceDoc/70000157g.pdf
已解决:
void util_atomic_add(uint16_t * pV, const uint16_t am) {
asm volatile (
"add %1, [%0], [%0]\n"
: "+r"(pV)
: "r"(am)
);
}
void util_atomic_sub(uint16_t * pV, const uint16_t am) {
asm volatile (
"subr %1, [%0], [%0]\n"
: "+r"(pV)
: "r"(am)
);
}
注:
谢谢您的快速而良好的答案