首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPLAB XC16:混合C与装配

MPLAB XC16:混合C与装配
EN

Stack Overflow用户
提问于 2016-01-29 17:46:12
回答 2查看 2K关注 0票数 0

我正在尝试混合一些C语言和汇编语言,我有一个很长的时间。我对C很有经验,在汇编方面也有一定的经验,但我以前从未在相同的项目中使用过它们。

目前,我正试图编译最简单的方案,即Q1.15定点乘法。实际上,我并不关心代码输出,我只是需要编译一些东西,这样我就可以构建代码输出了。

myq15.h:

代码语言:javascript
复制
#ifndef _Q15_MATH
#define _Q15_MATH

#include <stdint.h>

typedef int16_t q15_t;

extern q15_t q15_mul(q15_t multiplicand, q15_t multiplier);
q15_t q15_add(q15_t addend, q15_t adder);

#endif

myq15.c

代码语言:javascript
复制
#include "myq15.h"

q15_t q15_add(q15_t addend, q15_t adder){
    int32_t result = (uint32_t)addend + (uint32_t)adder;

    if(result > 32767)          result = 32767;
    else if(result < -32768)    result = -32768;

    return (q15_t)result;
}

myq15.s:

代码语言:javascript
复制
    .include "xc.inc"

    .text
    .global _q15_mul

_q15_mul:
    ; w3:w2 = w1 * w0
    mul.ss  w0, w1, w2

    ; w0 = (w3:w2) >> 15
    rlc     w2, w2
    rlc     w3, w3

    ; w0 = w3
    mov     w3, w0

    return

    .end

我的“主”文件只是调用一个q15_add()和q15_mul()实例。

在编译时,链接器声明:

代码语言:javascript
复制
build/default/production/_ext/608098890/myq15.o(.text+0x0): In function `_q15_mul':
: multiple definition of `_q15_mul'

再次,我试图弄清楚如何将程序集和C文件混合用于其他目的,但是如果我不能让这个简单的程序工作,我是没有希望的!

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-29 17:53:38

将文件命名为相同是个坏主意,工具链可能会混淆它们,因为默认情况下,myq15.cmyq15.s都编译为myq15.o

票数 1
EN

Stack Overflow用户

发布于 2016-11-30 19:08:36

可以在c文件中使用内联程序集。如果你没有很多的装配,这可能是最简单的方法。

建议将任何程序集封装到自己的函数调用(可以内联)中,以防止优化带来的任何副作用。

代码语言:javascript
复制
inline void SomeAssembly(void) {
  asm volatile(“pwrsav #”);
  asm volatile(“reset”);
} 

int main (void) {
  SomeAssembly();
  while(1);
  return -1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35090797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档