混合c和汇编cortex-m4

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

我想在GCC C中为cortex-m4编写一个例程,其中将C和汇编代码混合在一起。我正在尝试类似的东西

__attribute__((naked)) uint8_t dummy(uint8_t value)
{
    asm volatile (
            "push   {r1-r7, lr}\n\t"
             // R0 contains input value
             //here i do some operation on registers r0..r7         
             //.....
             //I guess result will be in the R0 register
            "MOV R0, R3\n\t"

            "pop    {r1-r7, pc}\n\t"
        );
}

但是不幸的是我有问题:

  • 我的程序因此崩溃。
  • 编译器声称我的“虚拟”例程没有返回值
c assembly arm cortex-m
2个回答
0
投票

使用真实汇编

.cpu cortex-m4
.thumb
.globl dummy
.thumb_func
dummy:
    mov r0,r3
    bx lr

调用约定允许修改r0-r3,返回r0,您无需触摸r4,r5,r6,r7,lr,因此无需推动它们。

丑陋,但您可以使用首选gcc,gnu汇编程序进行汇编(arm-whatever-as)


0
投票

如果以汇编语言编写函数体,则应考虑以汇编语言编写整个函数。查看[这里] [1]:

但是它就是它。因此,编译器说没有返回值,因为没有返回值。您避免使用return语句。 return语句不仅仅将值放入正确的寄存器中。它还会删除本地堆栈框架并重置堆栈和框架指针PC ...

如果您要返回某些内容,我建议按照[此处] [2]所述使用内联汇编。

int do(){    
    int input = 0;
    int output = 0;
    asm volatile ("push {r1-r7, lr}\n\t"
                  "mov  %1, r1;"
                  "mov  r1, %0;"
                  "pop  {r1-r7, lr}\n\t"
                  :"=r"(output) // = %0 
                  :"r"(input)  // = %1
                  :); 
    return output;
}´

    enter code here

  [1]: https://stackoverflow.com/questions/8054362/mixing-c-and-assembly-files
  [2]: https://stackoverflow.com/questions/14628885/manipulating-c-variable-via-inline-assembly
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.