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

rb->am += N

环形缓冲区 struct rb由变量N递增

我正在努力让ASM变得正确.这是我的伪代码

void myFunc(struct rb, const uint16_t N)
...
asm(
"mov w0, %0\n"
"add %1, w0"
: rb->am
: N
: w0
);

如果我理解ASM关键字ITS

asm(<instruction> : <input operants> : <output operants> : <clobbers>)

我目前不知道如何获得正确的语法.

W0是一个寄存器.我假设我需要告诉我的编译器我正在使用它.

需要将rb-gt;am解析为内存地址.

N是函数参数(如Rb).

你知道怎么把这件事做好吗?

[更新] 目标平台是MicroChip的dspic33.我查了程序员手册.在RAM中更改uint16变量的唯一ADD是针对W0/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

推荐答案

已解决:

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. 这是一个DSPIC33 MCU解决方案.
  2. 创建一个只包含ASM代码的C-函数会使工作变得容易得多
  3. 在输出中"=m"(PV)提供内存-但在我的例子中是间接地址(W*+OFF).DSPIC33的ADD和SUB不支持间接寻址.意味着您将"&;rb->;am"存储在一个寄存器中.通过这样做,您可以在输入"r"(Am)中使用直接寻址(pd=&;rb->;am)"+r"(Pd),以确保函数参数存储在某个寄存器中
  4. 在汇编器基础上判断代码,使用优化进行编译以加倍 判断

为快速而又好的答案而战

C++相关问答推荐

C strlen on char array

C指针算法在函数参数中的应用

返回一个包含数组的 struct

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

Ruby C Api处理异常

试图从CSV文件中获取双精度值,但在C++中始终为空

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

使用Open62541向OPCUA服务器发送读请求时内存泄漏

从整型转换为浮点型可能会改变其值.

生成的头文件不包括用户定义的文件

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

如何使用 VLA 语法使用 const 指针声明函数

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

在 C 中传递参数时出现整数溢出

为什么创建局部变量的指针需要过程在堆栈上分配空间?

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

C语言程序流程解释

如何使用 raylib 显示数组中的图像

仅使用其内存地址取消引用 C 中的 struct

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组