我研究一上午,寫了個程序,可謂麻雀雖小可五臟俱全,希望正在學習這塊的人能少找點資料,少花點時間更快的掌握。
#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.asm NAME ONE ;模塊的名稱 ;ORG 1000H ;函數存放的起始單元 ?PR?delay?ONE SEGMENT CODE ;標注函數的定義位置 ?PR?_add?ONE SEGMENT CODE ?PR?test?ONE SEGMENT CODE cc DATA 33H ;直接 定義數據的地址 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) ;帶參數的網上的資料EXTRN CODE(addcc) 我沒測試成功。按理名字應該加_fun 這個是帶參的定義方式 ;EXTRN DATA(?_addcc?BYTE) ;網上傳參通過這個我也沒試成功,直接對寄存器做數據的處理了。 RSEG ?PR?delay?ONE ;(不帶參函數)重新定位函數的代碼位置 delay: MOV R0 , #44H DJNZ R0,$ RET RSEG ?PR?_add?ONE ;(帶參函數)參數自動防止到寄存器中可以網上查下,這里 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: ;掉用不帶參數的C函數 CALL delay_c ;調用帶參數的C函數 MOV R5,#15 MOV R7,#11 LCALL _addcc MOV cc,R7 RET END ;程序結束