assembly 如何在c函数中混合使用c代码和asm?

tjrkku2a  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

我喜欢做一些优化,所以我喜欢用两行汇编程序代替一行c代码。

rb->am += N

字符串
ringbuffer结构rb增加一个变量N
我正在努力使asm正确。这是我的伪代码

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>)


我目前不知道如何获得正确的语法。
W 0是一个寄存器。我假设我需要告诉我的编译器我正在使用它。
rb->am需要被解析为存储器地址。
N是一个函数参数(如rb)。
你知道怎么做吗?
[更新]目标平台是微芯片的dspic 33。我查了程序员手册。唯一改变RAM上uint 16变量的ADD是针对w 0/WREG工作的。

ADD f {,WREG} -> Destination = f + WREG


Smth like(我的伪代码)

MOV WREG, N
ADD addr(rb->am)


这里有一个链接到我的源https://ww1.microchip.com/downloads/en/DeviceDoc/70000157g.pdf

olqngx59

olqngx591#

已解决:

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)
    );
}

字符串
注意事项:
1.这是一个DSPIC 33 MCU解决方案。
1.创建一个只有ASM代码的c函数会让工作变得更容易
1.在输出“=m”(pV)给你的内存-但在我的情况下作为间接地址(W*+offs). ADD和DSPIC 33不支持间接寻址.这意味着你采取“&rb->am”并将其存储在一个寄存器.通过这样做,你可以使用直接寻址(pD = &rb->am)“+r”(pD)在输入“r”(am)照顾功能参数存储在一些寄存器
1.在汇编程序基础上检查代码,编译时进行优化以进行双重检查
谢谢你的快速和良好的答案

相关问题