C51軟復位分析
這樣的語(yǔ)句就完成復位再啟功能了。類(lèi)型轉換符()的優(yōu)先級跟指針運算符*的優(yōu)先級相同,
二者的結合方向是自右至左,所以上述語(yǔ)句就能完成復位功能了。保險起見(jiàn)有些程序員常
常喜歡再加個(gè)括號:
#defineK(((void(*)())rst)
(*K)()
或
(*((void(*)())rst))();
由于沒(méi)有輸入參數,上述復位代碼更嚴謹的寫(xiě)法是:
#defineK(((void(*)(void))rst)
(*K)()
或
(*((void(*)(void))rst))();
關(guān)于帖子作者的解釋
千萬(wàn)不要犯“rst”形式的錯誤,對于一維數組而言,數組名rst就代表地址。以下二者等
價(jià),更常用的是等式左邊的形式:
rst==rst[0]
整個(gè)函數指針無(wú)所謂參數傳遞,只是把rst當作程序執行地址調用而已,那個(gè)學(xué)生的解釋也
有問(wèn)題。
還有一點(diǎn)必須提及,不是說(shuō)能通過(guò)編譯,甚至生成正確代碼,就表示某語(yǔ)句一定是對的。
對很復雜的語(yǔ)句,要考慮到編譯器不嚴格甚至出錯的可能性。
哈佛結構和一個(gè)蠕蟲(chóng)病毒
請注意,定義數組rst[]時(shí)用了關(guān)鍵字code,這是C51特有的關(guān)鍵字,意味著(zhù)把數組定義到
程序空間。標準C是沒(méi)有關(guān)鍵字code的。
哈佛結構和普林斯頓結構:
哈佛結構——程序空間和存儲空間分開(kāi)的。C51算是不太嚴格的哈佛結構——雖地址線(xiàn)分
開(kāi),但數據線(xiàn)沒(méi)有分開(kāi)。DSP是增強的哈佛結構。
PC電腦上奔騰CPU是普林斯頓結構——數據空間和程序空間統一編址。
如果數組rst[]數據的匯編機器碼是刪除文件的機器碼,這算不算是病毒?
曾經(jīng)流行過(guò)一種蠕蟲(chóng)病毒,其發(fā)作機理采取的就是將惡意代碼保存成文本文件,然后通過(guò)
指針調用執行這個(gè)文本,很多殺毒程序也不會(huì )查詢(xún)文本文件。
程序也罷,數據也罷都是二進(jìn)制形式,如果數據空間和程序空間是統一編碼的,數據當然
可以當作程序運行。
在這一點(diǎn)上,相對而言,哈佛結構的CPU安全性會(huì )好一點(diǎn)點(diǎn)。但嵌入式應用少有病毒,一般
不用關(guān)心。
評論