搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2011-3-19 14:48:11 | 显示全部楼层 |阅读模式
哪位给个汇编中 调用C函数的例子

出0入0汤圆

发表于 2011-3-19 15:03:42 | 显示全部楼层
汇编可调用 C编译出来的汇编。

出0入0汤圆

 楼主| 发表于 2011-3-19 16:13:22 | 显示全部楼层
最好给个例子

出0入0汤圆

发表于 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

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

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

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

    pop    r28
    ret

出0入0汤圆

 楼主| 发表于 2011-3-19 19:05:38 | 显示全部楼层
我用的是NEC 单片机  PM编译器 不知道NEC中是怎么操作的

出0入0汤圆

发表于 2011-3-19 19:47:41 | 显示全部楼层
回复【5楼】jpg4151
我用的是nec 单片机  pm编译器 不知道nec中是怎么操作的
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 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/fx  01--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
pop  ax
br $$
END

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

出0入0汤圆

发表于 2011-3-20 21:35:42 | 显示全部楼层
汇编里能调用C语言?

出0入0汤圆

发表于 2011-3-24 11:46:51 | 显示全部楼层
main.asm 声明成外部变量  
例 EXTRN  _CSUB

csub.c声明成公共变量,
然后在调用就可以啦
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 08:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表