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

问题描述 投票:0回答:1

我喜欢做一些优化,所以我喜欢用两行汇编程序代替一行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

c assembly inline-assembly
1个回答
0
投票

已解决:

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*+offs)。 DSPIC33 上的 ADD 和 SUB 不支持间接寻址。意味着您将“&rb->am”存储在寄存器中。通过这样做,您可以在输入“r”(am)中使用直接寻址(pD = &rb->am)“+r”(pD),以确保函数参数存储在某个寄存器中
  4. 检查汇编基础上的代码,优化编译以加倍 检查

谢谢您的快速而良好的答案

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.