|
請先看最下面的程序 這是一款針對Keil軟件的,被稱作“純軟件”復位的程序。所謂“純軟件”是指它沒有直接操作硬件以及寄存器。 事實上如果不懂硬件和匯編也不可能有這段C程序,不管怎么樣,我們還是來看一看它的真面目: 我們知道51單片機可以把數據放在程序存儲器里面,也就是程序和數據沒有本質區(qū)別,都是一些特定的數據。如果我們將一段程序,以數組數據的形式存儲在程序存儲器里面,那么是不是也可以執(zhí)行呢?答案是肯定的。 言歸正傳,先來看看這個數組數據 0xe4,0xc0,0xe0,0xc0,0xe0,0x22,中Keil的匯編窗口看出,它其實是四條匯編語句: CLR A ;編譯后為 0XE4 PUSH ACC ;編譯后為 0XC0 0XE0 PUSH ACC ;編譯后為 0XC0 0XE0 RET ;函數返回 編譯后為 0X22
可以看出,其實這就是51單片機的匯編復位指令。 其實這里只是C復位代碼的寫法難看而已,rst是一個指向程序存儲器的字節(jié)指針,我們把它轉換為指向返回為空的函數的指針,返回為空的函數指針的格式為:void (*)(),這個表達式比較復雜因運算符優(yōu)先級關系,用括號括號括起來,就成了(void (*)())rst,這樣rst就成函數指針了,再來看看求函數指針的一般格式(*p)(),把p代換成(void (*)())rst括起來就成了(*((void (*)())rst))(),這說將這個復位的全部面紗揭開了。 以下為測試,驗證程序: #include <AT89X51.h>main() { unsigned char code rst[6]={0xe4,0xc0,0xe0,0xc0,0xe0,0x22};//定義一個code類型的數組,一定要為code類型 while(1)//循環(huán)測試 { TMOD=5;//測試用可以是任何語名 TI=1; P1=0; P1=1; P2=2; P3=3; (*((void (*)())rst))();//復位 SCON=0x50; } } |