教授希望我们使用汇编代码编写程序的一部分,然后他希望我们从C程序中调用此代码,然后在完成后跳回C程序。我似乎无法找到任何关于此的文档。我正在使用使用68HC12的Dragon12板,如果重要的话。听起来他不希望我们使用内联asm()函数。
答案 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
中的D0
和2
中的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中用相同的参数编写一个函数并返回,在内部做一些最小的工作(访问每个参数,填入结果值),然后编译到汇编。确定您感兴趣的每项操作是如何完成的,并确定您的设置。