2013-03-02 175 views
1

教授希望我们使用汇编代码的程序的一部分程序,然后他希望我们从C程序中调用这个代码,然后完成时,它跳回到C程序。我似乎无法找到任何文件。如果有问题,我正在使用使用68HC12的Dragon12板。这听起来不像他希望我们使用内联asm()函数。如何在CodeWarrior内的C文件中调用汇编代码?

+0

听起来好像他希望你编写汇编代码来为你的平台使用C调用约定,这样你就可以在C程序中声明它为外部函数。 – Neil 2013-03-02 19:59:18

+0

关于这个问题有一个很好的技术说明,你应该在你的Codewarrior安装的某个地方把它作为pdf。否则,请在飞思卡尔网站上搜索它。 – Lundin 2013-03-07 13:35:33

回答

1

可以拨打装配只是定义在C任何正常功能(前提是你使用正确的调用约定)的函数,只要确定返回类型和参数匹配。例如,如果装配的样子:

extern int my_func(); 

// ... 
int zero = my_func(); 
-1

找出调用你的函数的正确方法是最简单的方法就是写:

my_func: 
    ; assembly code here 
    ; some more assembly code 
    ; etc. 
    xor ax, ax 
    ret 

然后你可以在C如下叫它C语言中的函数具有相同的参数和返回值,在内部进行一些最小化的工作(访问每个参数,填充结果值)并编译为汇编程序。确定你感兴趣的每个操作是如何完成的,并且你已经设置好了。

0

的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++事实并非如此。我不确定这是必需的,还是只是约定。

参数传递到连续的数据寄存器。在这种情况下,您会发现5D02D1

0

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

对于Kinetis微控制器和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"); 
}