指針實(shí)例(C51)--單片機(jī)
來源: | 作者: | 發(fā)表于:2013-05-25
指針實(shí)例(C51)--單片機(jī)
指針實(shí)例(C51)--單片機(jī)
1kic.com
#pragma src
#i nclude <reg51.H>
f(){}
f1(){}
f2(){}
main()
{
{
int x;
int *px;
//下面這些表示雖然很煩,但是生成的代碼卻及其簡潔:
//將 xdata 型指針 0x4000 賦給 px
px=(int xdata *)0x4000;
//表示從 xdata 0x4000處取一個(gè) char 給x
x=*((char xdata *)0x4000);
// 表示從 code 0x4000處取一個(gè) word 作為 xdata 型的指針 給
px
px=*((int xdata * xdata *)0x4000);
//表示從 code 0x4000處取一個(gè) word 作為 xdata 型的指針,
//再把這個(gè)指針指向的char數(shù)據(jù)賦給x
x=**((char xdata * code *)0x4000);
//表示把函數(shù)f()入口地址當(dāng)作xdata型指針,再把指向的xdata
//中的int型數(shù)據(jù)作為code型指針,把指向的code字節(jié)
//賦給x(暈,這樣有意義嗎?)
x=**(int code * xdata *)f;
//把f()入口地址處的ROM中兩個(gè)code型字節(jié),
//賦給堆棧指針SP指向的字節(jié)(想干什么?編操作系統(tǒng)?)
*(unsigned int idata *)SP=*(unsigned int code *)&f;
//表示把f()入口地址處的ROM中兩個(gè)code型字節(jié),
//作為一個(gè)xdata指針尋址,
//把指向的數(shù)據(jù)作為pdata指針尋址,
//再把把指向的數(shù)據(jù)作為idata指針尋址,
//把該地址處的一個(gè)字節(jié)賦給x (我靠,累死了)
x= ****(unsigned int data * idata * pdata * xdata * code
*)&f;
//總之,一個(gè)括號(hào)里面外面的"*"一樣多就表示指向的是數(shù)據(jù)。
}
{
//數(shù)組函數(shù)
code void (*ArrFn[])(void) =
{ &f1,
&f2,
};
//可以像引用數(shù)組一樣調(diào)用函數(shù)啦:
(*ArrFn[0])();
(*ArrFn[1])();
}
{
//這樣將使函數(shù)調(diào)用0000H處:
void (*reset) (void);
reset=0x0;
(*reset)();
reset();
//或者直接這樣,僅僅生成一條指令LCALL 1234H
((void (code *)(void))0x1234)();
}
{
//這樣可以調(diào)用RETI指令:
#define INT_NUM 30 //空閑中斷號(hào)
((void (code *)(void))(INT_NUM*8 3))();
//當(dāng)然需要在外面聲明 int_rpt()interrupt INT_NUM {}
}
{
//這樣調(diào)用RETI指令太變態(tài):
code unsigned char ret_i=0x32;
((void (code *)(void))(&ret_i))();
}
}
int_rpt()interrupt INT_NUM {}