【问题标题】:How do I call assembly code from a C file within CodeWarrior?如何从 CodeWarrior 中的 C 文件调用汇编代码?
【发布时间】:2013-03-02 19:50:31
【问题描述】:

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

【问题讨论】:

  • 听起来好像他想让你编写汇编代码来使用你平台的 C 调用约定,这样你就可以在你的 C 程序中将它声明为外部函数。
  • 有一个关于这个主题的优秀技术说明,你应该在你的 Codewarrior 安装的某个地方有它作为 pdf。否则搜索飞思卡尔网站。

标签: c assembly codewarrior 68hc12


【解决方案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();

【讨论】:

    【解决方案2】:

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

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

    为了说明,这里有一个示例代码sn-p:

    .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

    【讨论】:

      【解决方案3】:

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

      对于 Kinetis MCU 和 gcc, 也许下面的 sn-p 可能说明了一种可能性。 (这是我的故障处理程序的一部分) 下面,“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");
      }  
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2017-01-19
          • 2016-06-01
          • 2016-09-07
          • 2017-02-18
          • 2012-04-21
          • 2011-10-08
          • 1970-01-01
          • 2011-09-04
          • 1970-01-01
          相关资源
          最近更新 更多