jpg4151 发表于 2011-3-19 14:48:11

哪位给个汇编中 调用C函数的例子

哪位给个汇编中 调用C函数的例子

CC2530 发表于 2011-3-19 15:03:42

汇编可调用 C编译出来的汇编。

jpg4151 发表于 2011-3-19 16:13:22

最好给个例子

mitchell 发表于 2011-3-19 17:27:05

汇编中直接调用C中定义好的函数就可以了。
以AVR为例:

/* main.c ------------------------------------------*/
#include <avr\io.h>

void func1(void)
{
    asm("NOP");
}

int func2(char arg1, char arg2)
{
    return (256U + arg1 + arg2);
}

/*func_asm在test_asm.s中实现*/
/*int func_asm(char arg)
{
    func1();
    return (10 + func2(arg, 100));
}
*/

extern int func_asm(char arg);

/*Main function*/
int main(void)
{
    func_asm(1);
    while(1){
    }
    return (0);
}

/*--------------------------------------------------*/

/* test_asm.s --------------------------------------*/
.global func_asm
.extern func1, func2

func_asm:
    push   r28
    std    Y+1, r24

    rcallfunc1   ;调用在在main.c中定义的void func1(void)

    ldi    r22, 100;arg2 参数传递
    ldd    r24, Y+1;arg1 参数传递
    rcallfunc2   ;调用在在main.c中定义的int func2(char arg1, char arg2)

    adiw   r24, 10   ;返回值在r24中, +10返回

    pop    r28
    ret

jpg4151 发表于 2011-3-19 19:05:38

我用的是NEC 单片机PM编译器 不知道NEC中是怎么操作的

mitchell 发表于 2011-3-19 19:47:41

回复【5楼】jpg4151
我用的是nec 单片机pm编译器 不知道nec中是怎么操作的
-----------------------------------------------------------------------

提问又不把问题说清楚,给你例子就是个参考,自己搞明白编译的原理再说。

jpg4151 发表于 2011-3-20 21:05:28

这是我写的main.asm 调用csub.c中函数的代码。 编译有问题,哪位指教下
用的是NEC 单片机 PM编译器
;main.asm***********************************
EXTRN   _CSUB

@@VECT         CSEG AT   0000H
DW START   ;0000;复位中断

@@OPT          CSEG AT   0080H
;***************************************
;      -||----------;上电或复位释放后振荡稳定时间 00--2^10/fx01--2^12/fx 10--2^15/fx 11--2^17/fx
;      ----|--------;RMCE 1--RESET口作为复位输入 0--普通输入口
;      -----||------;OSCSEL1 OSCSEL0 00--外部晶振,01--外部时钟,1x--内部时钟
;      -------|-----;LIOCP 内部低速时钟 0--振荡通过软件停止
DB 94H            ;10010100内部时钟,复位口做普通输入口,

;**************************************

START:
movw ax,#20H ;set 2nd argument(j)
push ax
movw ax,#21H ;set 1st argument(i)
call!_CSUB
popax
br $$
END

/* csub.c --------------------------------------*/
void CSUB(int i, int j)
{
    i+=j ;
}

gprs_new 发表于 2011-3-20 21:35:42

汇编里能调用C语言?

guyueguang 发表于 2011-3-24 11:46:51

main.asm 声明成外部变量
例 EXTRN_CSUB

csub.c声明成公共变量,
然后在调用就可以啦
页: [1]
查看完整版本: 哪位给个汇编中 调用C函数的例子