教授希望我们使用汇编代码编写程序的一部分,然后他希望我们从 C 程序中调用这段代码,然后在完成后跳回 C 程序。我似乎找不到任何关于此的文档。如果重要的话,我正在使用使用 68HC12 的 Dragon12 板。听起来他不希望我们使用内联 asm() 函数。
4 回答
您可以像调用 C 中的任何普通函数一样调用汇编中定义的函数(只要您使用正确的调用约定),只需确保返回类型和参数匹配。例如,如果程序集如下所示:
my_func:
; assembly code here
; some more assembly code
; etc.
xor ax, ax
ret
然后你可以从 C 中调用它,如下所示:
extern int my_func();
// ...
int zero = my_func();
很久以前的问题,但答案可能仍然有帮助。
对于 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");
}
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
inD0
和2
in D1
。
找出调用函数的正确方法的最简单方法就是用相同的参数在 C 中编写一个函数并返回,在内部做一些最小的工作(访问每个参数,填写结果值),然后编译到汇编程序。确定您感兴趣的每项操作是如何完成的,并且您已做好准备。