A51与C语言的混合编程

时间:2012-08-10来源:网络

我研究一上午,写了个程序,可谓麻雀虽小可五脏俱全,希望正在学习这块的人能少找点资料,少花点时间更快的掌握。

#include reg52.h>/****在汇编中定义*****/extern void delay(void) ;extern add(int a,int b);//测试汇编调用的代码(不想直接用汇编来走主程序)extern void test();/***在汇编中定义的代码段****/extern  unsigned char cc;//  C语言中定义的函数void delay_c();unsigned int addcc(unsigned int wd1,unsigned int wd2);//C语言中定义的数据段unsigned int aa;unsigned int bb;void main(){delay();cc=add(10,15);test();while(1);}void delay_c(){unsigned char cc;cc=0xff;while(cc--);}unsigned int addcc(unsigned int wd1,unsigned int wd2){unsigned int cl;cl=wd1+wd2;return cl;}delay.asmNAME  ONE        ;模块的名称;ORG  1000H       ;函数存放的起始单元?PR?delay?ONE      SEGMENT CODE   ;标注函数的定义位置?PR?_add?ONE       SEGMENT CODE?PR?test?ONE    SEGMENT CODEcc       DATA   33H     ;直接 定义数据的地址PUBLIC delay     ;声明为全局PUBLIC _addPUBLIC testPUBLIC cc     ;声明全局EXTRN DATA(aa)  ;注意这里是extrn 而不是C中extern  在 c中定义EXTRN DATA(bb)EXTRN CODE(delay_c)EXTRN CODE(_addcc)        ;带参数的网上的资料EXTRN CODE(addcc) 我没测试成功。
按理名字应该加_fun 这个是带参的定义方式;EXTRN DATA(?_addcc?BYTE) ;网上传参通过这个我也没试成功,直接对寄存器做数据的处理了。RSEG  ?PR?delay?ONE   ;(不带参函数)重新定位函数的代码位置delay:MOV R0 , #44HDJNZ R0,$RETRSEG ?PR?_add?ONE      ;(带参函数)参数自动防止到寄存器中可以网上查下,
这里 15分别存放到R7,R6  10存入R5,R4_add:MOV A,R5ADD A,R7MOV R7,AMOV A,R4ADDC A,R6MOV aa,R7RETRSEG ?PR?test?ONEtest:;掉用不带参数的C函数CALL delay_c;调用带参数的C函数MOV R5,#15MOV R7,#11LCALL _addccMOV cc,R7RETEND  ;程序结束

关键词: A51 C语言 混合编程

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版