專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

A51與C語言的混合編程

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年01月02日   【字體:

我研究一上午,寫了個程序,可謂麻雀雖小可五臟俱全,希望正在學(xué)習(xí)這塊的人能少找點資料,少花點時間更快的掌握。

#include <reg52.h>
/****在匯編中定義*****/
extern void delay(void) ;
extern add(int a,int b);
//測試匯編調(diào)用的代碼(不想直接用匯編來走主程序)
extern void test();
/***在匯編中定義的代碼段****/
extern  unsigned char cc;

//  C語言中定義的函數(shù)
void delay_c();
unsigned int addcc(unsigned int wd1,unsigned int wd2);
//C語言中定義的數(shù)據(jù)段
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.asm


NAME  ONE        ;模塊的名稱
;ORG  1000H       ;函數(shù)存放的起始單元
?PR?delay?ONE      SEGMENT CODE   ;標(biāo)注函數(shù)的定義位置
?PR?_add?ONE       SEGMENT CODE
?PR?test?ONE    SEGMENT CODE
cc       DATA   33H     ;直接 定義數(shù)據(jù)的地址
PUBLIC delay     ;聲明為全局
PUBLIC _add
PUBLIC test
PUBLIC cc     ;聲明全局
EXTRN DATA(aa)  ;注意這里是extrn 而不是C中extern  在 c中定義
EXTRN DATA(bb)
EXTRN CODE(delay_c)
EXTRN CODE(_addcc)        ;帶參數(shù)的網(wǎng)上的資料EXTRN CODE(addcc) 我沒測試成功。按理名字應(yīng)該加_fun 這個是帶參的定義方式
;EXTRN DATA(?_addcc?BYTE) ;網(wǎng)上傳參通過這個我也沒試成功,直接對寄存器做數(shù)據(jù)的處理了。

   RSEG  ?PR?delay?ONE   ;(不帶參函數(shù))重新定位函數(shù)的代碼位置
delay:
   MOV R0 , #44H
   DJNZ R0,$
   RET
  RSEG ?PR?_add?ONE      ;(帶參函數(shù))參數(shù)自動防止到寄存器中可以網(wǎng)上查下,這里 15分別存放到R7,R6  10存入R5,R4
_add:
   MOV A,R5
   ADD A,R7
   MOV R7,A
   MOV A,R4
   ADDC A,R6
   MOV aa,R7
   RET

RSEG ?PR?test?ONE
test:
  ;掉用不帶參數(shù)的C函數(shù)
  CALL delay_c
  ;調(diào)用帶參數(shù)的C函數(shù)
  MOV R5,#15
  MOV R7,#11
  LCALL _addcc
  MOV cc,R7
  RET
END  ;程序結(jié)束
關(guān)閉窗口

相關(guān)文章