教授希望我们使用汇编代码编写程序的一部分,然后他希望我们从C程序内部调用这些代码,然后在完成后跳回C程序。我似乎找不到任何关于这方面的文档。如果重要的话,我正在使用使用68HC12的Dragon12板。听起来他并不想让我们使用内联asm()函数。
发布于 2013-03-03 04:01:05
你可以像在C中调用任何普通函数一样调用在汇编中定义的函数(只要你使用了正确的调用约定),只要确保返回类型和参数匹配即可。例如,如果程序集如下所示:
my_func:
; assembly code here
; some more assembly code
; etc.
xor ax, ax
ret然后,您可以从C调用它,如下所示:
extern int my_func();
// ...
int zero = my_func();发布于 2014-04-08 10:24:16
CodeWarrior开发工作室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++中没有。我不确定这是必需的,还是仅仅是约定。
参数被传递到顺序数据寄存器。在本例中,您可能希望在D0中找到5,在D1中找到2。
发布于 2015-01-19 22:49:01
很久以前的问题,但答案可能仍然有帮助。
对于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");
} https://stackoverflow.com/questions/15178703
复制相似问题