我喜欢做一些优化,所以我喜欢用两行汇编程序代替一行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
1条答案
按热度按时间olqngx591#
已解决:
字符串
注意事项:
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.在汇编程序基础上检查代码,编译时进行优化以进行双重检查
谢谢你的快速和良好的答案