首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CodeWarrior中调用C文件中的汇编代码?

如何在CodeWarrior中调用C文件中的汇编代码?
EN

Stack Overflow用户
提问于 2013-03-03 03:50:31
回答 4查看 2.5K关注 0票数 1

教授希望我们使用汇编代码编写程序的一部分,然后他希望我们从C程序内部调用这些代码,然后在完成后跳回C程序。我似乎找不到任何关于这方面的文档。如果重要的话,我正在使用使用68HC12的Dragon12板。听起来他并不想让我们使用内联asm()函数。

EN

回答 4

Stack Overflow用户

发布于 2013-03-03 04:01:05

你可以像在C中调用任何普通函数一样调用在汇编中定义的函数(只要你使用了正确的调用约定),只要确保返回类型和参数匹配即可。例如,如果程序集如下所示:

代码语言:javascript
复制
my_func:
    ; assembly code here
    ; some more assembly code
    ; etc.
    xor ax, ax
    ret

然后,您可以从C调用它,如下所示:

代码语言:javascript
复制
extern int my_func();

// ...
int zero = my_func();
票数 1
EN

Stack Overflow用户

发布于 2014-04-08 10:24:16

CodeWarrior开发工作室10.5的帮助菜单文档描述了如何从C/C++代码中调用纯汇编语言函数,如下所示:

在部件文件中定义的标签具有本地范围。要从另一个文件( .c文件)访问它们,应该将它们标记为全局。例如,.global _my_asm_func

为了说明这一点,下面是一个示例代码片段:

代码语言:javascript
复制
.global _my_asm_func
.text

_my_asm_func:
    subq.l   #4,a7
    move.l   d1,(a7)
    add.l    (a7),d0
    addq.l   #4,a7
    rts

在C/C++代码中,首先声明函数的原型。例如,int my_asm_func(int a, int b);。然后像调用任何其他C/C++函数一样调用该函数。例如,my_asm_func(5, 2);

请注意,在汇编代码中,函数以下划线为前缀,但在C/C++中没有。我不确定这是必需的,还是仅仅是约定。

参数被传递到顺序数据寄存器。在本例中,您可能希望在D0中找到5,在D1中找到2

票数 0
EN

Stack Overflow用户

发布于 2015-01-19 22:49:01

很久以前的问题,但答案可能仍然有帮助。

对于Kinetis MCU和gcc来说,也许下面的代码片段可以说明一种可能性。(它是我的错误处理程序的一部分)下面,"PE_ISR“中断使用内联汇编程序来调用FaultHandlerAsm函数,该函数也是内联汇编程序。最后,它转移到一个c函数"faultHandlerC",这里不包括它。

代码语言:javascript
复制
void FaultHandlerAsm(void)
{
  __asm volatile (
    " movs r0,#4       \n"
    " movs r1, lr      \n"
    " tst r0, r1       \n"
    " beq _MSP         \n"
    " mrs r0, psp      \n"
    " b _HALT          \n"
  "_MSP:               \n"
    " mrs r0, msp      \n"
  "_HALT:              \n"
    " ldr r1,[r0,#20]  \n"
    " b FaultHandlerC  \n"
    //" bkpt #0          \n"
  );
}

PE_ISR(Cpu_INT_Hard_FaultInterrupt)
{
   __asm(    " b FaultHandlerAsm \n");
}  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15178703

复制
相关文章

相似问题

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