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

时间:2013-03-02 19:50:31

标签: c assembly codewarrior 68hc12

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

4 个答案:

答案 0 :(得分:1)

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

my_func:
    ; assembly code here
    ; some more assembly code
    ; etc.
    xor ax, ax
    ret

然后您可以按如下方式从C中调用它:

extern int my_func();

// ...
int zero = my_func();

答案 1 :(得分:0)

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

程序集文件中定义的标签具有本地范围。要从其他文件(.c文件)访问它们,应将它们标记为全局。例如,.global _my_asm_func

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

.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 ++中则不是。我不确定这是否是必需的,或者只是惯例。

将参数传递到顺序数据寄存器。在这种情况下,您希望5中的D02中的D1找到。{/ p>

答案 2 :(得分:0)

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

对于Kinetis MCU和gcc, 也许以下片段可能会说明一种可能性。 (这是我的错误处理程序的一部分) 下面,“PE_ISR”中断使用内联汇编程序来调用FaultHandlerAsm 函数,反过来也是内联汇编程序。 最后,它分支到一个c函数“faultHandlerC”,这里没有包含它。

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");
}  

答案 3 :(得分:-1)

找出调用函数的正确方法的最简单方法就是在C中用相同的参数编写一个函数并返回,在内部做一些最小的工作(访问每个参数,填入结果值),然后编译到汇编。确定您感兴趣的每项操作是如何完成的,并确定您的设置。