1

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

4

4 回答 4

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();
于 2013-03-02T20:01:04.937 回答
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");
}  
于 2015-01-19T14:49:00.790 回答
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++ 中则不然。我不确定这是否是必需的,或者只是约定。

参数被传递到顺序数据寄存器。在这种情况下,您会期望找到5inD02in D1

于 2014-04-08T02:24:16.217 回答
-1

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

于 2013-03-02T22:54:08.203 回答