我研究一上午,寫了個程序,可謂麻雀雖小可五臟俱全,希望正在學習這塊的人能少找點資料,少花點時間更快的掌握。
#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 ;程序結束
