A51与C语言的混合编程
我研究一上午,写了个程序,可谓麻雀虽小可五脏俱全,希望正在学习这块的人能少找点资料,少花点时间更快的掌握。
#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 ;程序结束
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码