Recent Comments

This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

2008年3月10日 星期一

DWORD和dword到底有什麼不同?

DWORD:32bit的 unsigned long

這適合各種作業系統喔

我們開啟「登錄編輯器」或「登錄編輯程式」之後,若我們想增加一個DWORD值,我們可以在右側視窗按下滑鼠右鍵,選"新增"-->"DWORD值",再依自己需要新增DWORD值,這樣新增DWORD值的工作就算是結束了。

可是我們要自己寫一個DWORD值的登錄檔,我們卻必須這樣寫
"新增之DWORD值"=dword:00000001

"新增之DWORD值"=dword:1

但是,我們卻「不可以」這樣寫
"新增之DWORD值"=DWORD:00000001

"新增之DWORD值"=DWORD:1

這是因為Windows Registry只認識dword,卻不認識DWORD的緣故。
所以您若寫一個登錄檔如下
REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoRun"=DWORD:00000000
然後儲存檔案時以reg為副檔名,執行並增加登錄的話。外表看起來,「好像」是已經增加登錄了,可是實際上因為Windows Registry不認識DWORD,所以您的「增加登錄」動作還是「失敗」囉。

請注意:
寫一個dword值的登錄檔時,必須全部用小寫的dword,若其中一個英文字母不是小寫的話,您是無法順利「增加登錄」的。

希望這篇文章能夠讓您進一步認識Windows登錄檔喔。

2008年3月5日 星期三

BCB include 後加不加.h

把.h從header files 拿掉的不是 ANSI C, 而是 ANSI C++。ANSI C++引進 name space 的機制,將所有的全域宣告都放在 std 這個 name space 下;為了要向下相容 C 及非標準 C++ 的程式碼,所以保留了帶有 .h 的 header files。

====@一@=======================
#include
using namespace std;

std::vector test;

====@二@=======================
#include

vector test;

2008年2月25日 星期一

[轉自IThome]IT自救術-處理器想的和你想的不一樣

術-處理器想的和你想的不一樣

文/嚴立群 (記者) 2008-02-14

人類做算術,心智的活動是很自由的,但是處理器不行,處理器一次只能做一步簡單的運算,所以剛接觸電腦的人,大多會覺得難以理解,「這東西的運作方法怎麼這麼怪?」

假設存在一個32位元加法器,要設法讓它幫我們不斷的計算A+B,那只需要讓數字在加法器後面排隊,照順序饋入加法器,加法器就會一個一個把結果算出來。

這是一個典型的「磨坊-穀倉」系統,加法器就是「磨」,不斷饋入的數字是「穀物」,算出的結果就是「穀粉」。這裡要引入一個概念,就是「穀倉」的必要性。


簡單的加法系統

從「加法器」擴展到「處理器」
接著我們來擴展這個系統,想一想處理器會是個怎樣的系統

● 加法器只能做加法,這不夠好,我們得設計個全功能的處理器,能作加法、減法、乘法、除法、各種邏輯運算……,而且都是越快越好。

● 原來的加法器因為只做加法,所以我們放在記憶體裡面的「數字」就只是依序排隊饋入即可──因為反正只有加法動作要做而已。但是既然有了更複雜的處理器,後面排隊的就不能只是數字(不能只有運算子),還得有「運算方式」(運算元),得設計處理器讓它判斷該怎麼處理後面排隊的「穀物」(我是說,數字)。

這裡有個重要的概念,「你不能用人類的想法去操作處理器,你得用處理器的方式」。

人類習慣的做法是,3 + 5 = 8,很單純的計算加法,但處理器沒辦法。

處理器的做法(以80x86為例)是:

MOV AX, 03
ADD AX, 05

第一行的「MOV AX, 03」,就是「把16進位的3搬到AX暫存器裡面」的意思,第二行的「ADD AX, 05」,則是指「把16進位的5和AX目前的值加起來,並把結果存到AX裡面」。

是,有沒有覺得「這真是『微言大義』啊!」,每個處理器都像是筆削春秋的孔子,一個指令就蘊含著多麼深奧的奧義在裡頭啊!
請參考下列的「8086的『3 + 5 = 8』操作過程」。


8086的「3 + 5 = 8」操作過程
1. 執行「命令提示字元」,在命令提示符號下輸入「DEBUG」然後按下Enter

2. 輸入A100(A表示開始組譯程式碼,100表示從100這個位址開始,不要問我為什麼要這樣,反正就是這樣),按下Enter

3. 輸入「MOV AX, 03」後按下Enter

4. 輸入「ADD AX, 05」後按下Enter,然後再按一次Enter表示輸入結束

5. 輸入R並按下Enter,可看一下目前的8086暫存器內容,AX目前內容應該是0(R=Register,DEBUG程式中用來顯示暫存器內容的命令。另,如果你輸入問號「?」後按下Enter,可以看到所有DEBUG的指令)

6. 目前只是輸入完成,請按下「P」(P = proceed,執行的意思)然後按下Enter來執行第一行指令(也就是MOV AX, 03)

7. 請看AX內容,此時果然變成3了

8. 接著再輸入一次P並按下「Enter」,此時執行第二行指令(ADD AX, 05)

9. 再看AX內容,此時果然變成8了(因為3 + 5 = 8啊)

10. 輸入U100 U103(U表示unassemble,反組譯的意思),可以看到兩行程式碼前面有一些數字q,請先看一下,等下會解釋。

處理器的動作
當我們請處理器算「3 + 5 = 8」這麼簡單的算數時,給它的東西得是「MOV AX, 03」和「ADD AX, 05」。

事實上這樣講也不太精確。

處理器實際上是一顆晶片,它只能接受電子訊號。假設低電位是0,高電位是1,所以你真的對它講「MOV AX, 03」,它也不認得,它唯一能認得的,只有電子訊號。

事實上,它認得的,就是剛才的過程中,第10步裡,用U100反組譯出來的機器碼。舉例來說,「MOV AX, 03」的機器碼是「B80300」,「ADD AX, 05」的機器碼是「050500」。你對處理器只能用這樣的形式溝通。事實上,你得在適當的腳位輸入適當的訊號(B80300和050500的二進位形式),然後處理器收到訊號,就會跟據訊號做出對應的動作。

現代處理器系統的運作模式,就是這樣。

所謂的程式,只是充滿了各種人類「表面上看起來難解」的數字,「B80300」、「050500」……在記憶體裡面排隊,這些數字饋入處理器之後,處理器就會跟據這些數字的意義,做適當的動作,把結果算出來,就這樣而已。

至於能夠多快?很簡單,廠商會想辦法。如果MOV AX, 03是「一則運算」,那以前的處理器可能慢些,4.77MHz(一秒鐘做4.77百萬次),現在的處理器可能快些,1GHz應該很快了(一秒鐘做100億次)。而且以效能來看,處理器的效能還因為技術的進步,效能可能高達早期處理器的2000倍?4000倍?總之是快得恐怖,而且還會一路快下去。

Little-Endian和Big-Endian
接著我們來研究一下,機器碼的一個小知識,「Little Endian」和「Big-Endian」。

簡而言之,資料的最小單位假設一般用「byte」,每一個記憶體位址儲存的是1-byte的數字,但處理器一次處理資料的最小單位是「word」,那這一個word裡面,較小的數字放在「較低位址」,較大的數字放在「較高位址」,稱為「Little-Endian」。

比方說,以8086處理器而言,它的1個word是16-bit,當我們寫0300,0300是一個word的數字(16位元的16進位數字)。左邊的數字是較高(代表較大)的數字。但是,一般印刷或是螢幕顯示的慣例,從左到右卻是「越來越大」。所以,0300在螢幕上顯示成0003。

所以,「MOV AX, 03」翻譯成機器碼,卻變成「B8 03 00」,B8是MOV AX的機器碼,03其實是0003,但在Debug下顯示卻變成0300。
至於Big-Endian,則是指「處理器一次處理的單位資料,較高位數的資料卻放在較低的位址」。目前世界上,IBM的PowerPC處理器是Big-Endian的典型代表作,Intel x86系列處理器則是Little-Endian的代表作。

組合語言「妙處難與君說」
為何組合語言程式不能更容易些?

老實說,很難。

處理器裡面有很多暫存器,這是因為人類想了很久,都只想到這個辦法,「把數字搬到暫存器,然後對暫存器做出運算的動作」。所以一個「3 + 5」,以8086而言,就得分兩次(先MOV,再ADD)。一旦你習慣了這種「思考模式」,就可以用組合語言寫各種程式。

因此,古時候的人學寫程式,尤其是用某處理器的組合語言寫程式,就得先研究該處理器的「能耐」。處理器有哪些指令?學熟了,才知道怎樣的指令可以運用在什麼場合。處理器能夠怎麼讀取資料?得把所謂的「定址模式」搞清楚,才能夠存取大量資料(畢竟程式是用來處理資料的)。怎樣寫程式才會快?你得知道這處理器的「脾胃」,不然你寫出來的程式會跑得像龜一樣,不能用。你還得熟習各種工具的使用,幫助你寫程式寫得又快又好,又沒有「蟲」。

用組合語言寫的程式,我印象最深刻的,應該就是Lotus 1-2-3這個試算表了。其實Lotus 1-2-3並不是世界上第一個試算表產品。那難道是Microsoft的Excel?那更加不是。目前公認的「試算表之祖」,是丹.布魯克林所寫的VisiCalc。

不過,總之,VisiCalc因為某些原因後來並沒有壯大,後來的PC市場,主要是Microsoft的Multiplan(不是Excel)和 Lotus在爭奪DOS下的試算表市場。但是Lotus 1-2-3因為完全用組合語言撰寫,所以速度快,因此獲得華爾街諸多公司的青睞。Multiplan則為了「跨平臺」,當時使用C語言撰寫,效能普通,因此被打得潰不成軍,早已經不見蹤影。

這故事給我們幾個啟示:

1. Microsoft也有過失敗之作,所以失敗並不可恥
2. 此一時也彼一時也,以前的人用組合語言才厲害,現在則否
3. 組合語言的跨平臺性不佳,但如果你不考慮跨平臺性,可以用用
4. Microsoft的恐怖並不只在於它失敗了還會再爬起來而已,它更恐怖的地方是它爬起來了之後還會試著把敵人幹掉,絕對不是說說而已

本期結語:流動與靜止的藝術
處理器的運作方式很單純,一條指令,一次只能做一個簡單動作而已。就連3 + 5,都只能分兩次做。

在那一瞬間,真是很單純很單純。

但是,工程師的挑戰,就是要不斷的縮短這「一瞬間」,讓電子的流動化為運算的智慧,把很高速很短暫的一瞬間集合起來,這樣就可創造出複雜的結果,運算的結果。

想像一下,你買了一個「吹風機」,吹風機插上電,一打開開關就開始運作,那是電力的作用,讓風扇轉動,這種力量固然厲害,小小的電子驅動各種裝置,但是吹風機沒法告訴你3 + 5等於多少,無論如何沒辦法。

但是一樣是電子的流動,要怎樣的設計才能讓晶片能夠算出3 + 5?這很有趣,我們現在知道,「半導體」的單通特性使它變成一種開關,可以用來模擬演算。人類是走了很長的路才走到今天,這實在是非常有趣的事情。流動的電子,但每一瞬間卻又得維持靜止的狀態,讓人類可以構思各種運算。

處理器的運作原理大致講到這裡,我們下期可以來開始研究一下x86的組織結構,簡單的組合語言程式。

[轉自IThome]IT自救術-數碼系統的轉換

IT自救術-數碼系統的轉換

文/嚴立群 (記者) 2008-01-24

我們可以做一個10進位的電腦,但那會非常困難,而做一個2進位的電腦簡單多了,且它會做的事情和10進位電腦一樣多。

數字,只是人類發明,用來對應數量的符號。

因此,數字可以用不同形式表示,但是其所代表數量的抽象意義是相同的。例如常見的羅馬數字I、II、III、IV、V……,其實和一般的阿拉伯數字1、2、3、4、5……,或是國字的壹、貳、參、肆、伍……,都是一樣的意思。

只因為人類有10根手指頭
既然如此,且讓我們來想想,為何電腦(處理器)只能用「2進位」來做事情?

在解答這個問題之前,請先讓我們來解釋一下「10進位」是什麼。
所謂的10進位,請讓我們看一個簡單的數字:「285」。其中,2是「百位數」,8是「十位數」,5是「個位數」。

用公式表示就是:285 = 2×102 + 8×101 + 5×100。

但是,如果你真的有思考,那我得告訴你,285這符號,僅是為了簡單的描述數量用的符號,事實上,人類也可以把「每一個單一的數量都用一個單一的符號」來表示。

但那會累死人,現代數學就幾乎無法建立了。

如果你夠無聊(至少像我一樣無聊),你從1數到9(1、2、3……9),當你數到「10」的時候,請注意,其實你也可以用一個怪異的符號來代替10(像是, A),這並無損於10的數量意義。只是,10這個符號前面的「1」,實際上我們每個人都知道那其實是「1×101」。如果你硬要用A代表10,行嗎?行,只要你和其他人講話時,人家都聽得懂你說啥就行。你說「魚缸裡有A隻魚」,「我從地上撿到A塊錢」,可以的,只要別人聽得懂就行,只要他知道「原來此時A =10」就可以了。

「電子」是節能快速的基礎
表示數字,基本上是個簡單的事情。但要這些數字做運算,就牽涉複雜多的因素了。以前講過,用「算盤」做數字運算,其實是「人腦」在做運算,但至少算盤簡化了數字的記錄。後來的科學家打算做更精巧的機器,用齒輪、連桿等機械,製造一個「10進位運算機器」。當時的機械製造精密程度不足,因此這類的製造嘗試失敗了。科學家花了很長的時間才了解幾件事:

● 用「機械」的方式製造運算機器,不是不可能,但要做到極端的精密十分困難。

● 製造「10進位」的計算機器也不是不可能,但會造成這機器的設計極端複雜,同樣也幾乎不可能被製造出來。

科學家最後的結論是,「可以製造一臺最省能源、速度最快的計算機器,並且用2進位的設計即可」。

後來這個結論就是「電子計算機」。用電力驅動計算機器,是最省能源的方式(相對於科學家早早就想用的「純機械」的方法來說,電子計算機是超省能源了)。

選擇2進位只是因為「這是必要的」為何選擇「2進位」?
因為,「計算加減乘除」這些運算,事實上都是人類為了處理數量所發明出來的「動作」,這些動作用哪種數字系統來做,結果都是一樣的。選擇2進位只是因為,用來處理運算的「電子計算機」,用2進位的方式(低電位表示0,高電位表示1)來設計是最簡單的方式罷了。

電子計算機(電腦,或是處理器)實際上只是一個「運算的『模擬器』」,選擇2進位只是因為「製造技術上的需求」而已。如果你夠無聊,打算做一臺「3進位的電子計算機」,行嗎?行的,但這3進位的機器能做的事情不會多於2進位的計算機。而2進位計算機所做的任何運算,都可以同等於10進位運算。因為,設計處理器的人會設法讓它「模擬的就像是人類運算一樣」。

這稱為「超越工程學」。

所以,無論是當初還是現在,你就知道:為何學電腦,學處理器,學計算機概論,學院派的教學總是要你去學「數碼系統的轉換」,其實那只是因為:用2 進位設計電腦是「目前人類已知唯一的選擇」。會不會火星人其實用9進位來設計電腦?天曉得,雖然不無可能,但你得去問火星人才知道答案就是。

由於可用高低電位來代表0與1,人類便可據此設計模擬一般數學運算的邏輯電路。因此現代計算機科學的基礎,可說完全建立在這種「二進位運算」和「二元性電路」的特性上。幾乎所有的計算機科學相關教科書,也都假設讀的人了解這件事。當然,這個結論可能不是鐵律,你也可以辯稱這種方式的電腦無效率(什麼,只能用二進位?)。不過,到目前為止,所有的商業電腦都是用「電路和數字的二元性」來設計。如果閣下只是想了解電腦,那也暫時別去管為什麼了,先記下來就是了。想了解「為什麼二元性這麼重要」,得慢慢學,學熟了才有點概念。

常用數碼系統的介紹
但是,用2進位的方式,數字的紀錄會過於冗長,因此學電腦,學處理器的原理,我們都得先學「數碼系統的轉換」。

在此介紹一個名詞:基底(base)。

人類常用的數字是10進位,我們通常就說這是以10為基底的數字表示方式。比方說「285」,我們就知道這是二百八十五,2×102 + 8×101 + 5×100。有時候,我們會寫成(285)10,下標的10就是說這數字的基底為10,也就是說「這是10進位數字」。

一個數字可以任選基底來表示,不會影響所表現的數量意義。例如(1111)2 = (15)10。首先現在來介紹一下,一般常見的數碼系統有哪些:

● 2進位:0,1,10,11,100,101,110,111,……
● 8進位:0,1,2,3,4,5,6,7,10,11,……
● 10進位:0,1,2,3,4,5,6,7,8,9,10,11,……
● 16進位:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,……

顧名思義,數碼系統是「以2為底」,那就是2進位。逢2進1。而「以16為底」是比較特殊的系統,因為你得用15個不同的符號來代表整個數碼系統,因此「9」後面接的是「A、B、C、D、E、F」,分別代表原先十進位的10、11、12、13、14、15。剛開始,面對數碼系統中夾雜英文,初學者大多不太習慣。不過這也沒什麼,只要看多了就習慣了。

可以有其他不同的進位系統嗎?五進位?十二進位?可以的,選擇任何數當作基底都可以。可是選擇其他的基底並沒有太大用途,相當罕用,我們就不花太多力氣在這方面的說明了。

怪異的符號只是因為他是16進位
不過,我對數碼系統的說明,打算介紹到這裡就好了。大家可以看一下「各種基底數字對照表」,就可以知道,各種基底不同的數字,雖然是表示同樣的數量,但是所謂的符號卻是不同。比方說:你突然看到「10」,但若是16進位的10,其實是等於10進位的16,也就是:(10)16 = (16)10。又或者說,(12)10 = (1100)2 = (14)8 = (C)16。

當你看到Debug裡面的奇怪的符號,其實,只不過,那都是用16進位表示的數字罷了。為何選16進位?因為用2進位表示數字太冗長。那為何一定要用2進位設計處理器?只是因為電子計算機用2進位(電位高低)的方式最容易設計。

本期結語:最後,請熟記「類比」和「數位」的真實意義
講到這裡,我們用倒推的邏輯來想:什麼是「類比」?什麼是「數位」?常聽到有人說「數位計算機」、「數位電腦」,為何不是「類比計算機」?

數位這個詞,其實只是指「用數字來表示數量」罷了。比方說,大多數手錶用指針(所指的角度)來表示時間數量,不是用數字,但是所謂的電子錶就直接顯示數字時間,簡單省事直接。

換句話說,「類比」是所謂的「依類相比」,為了表示數量,你得有個依據,用角度,用其他的物件,用繩結,用各種適合的東西來表示數字,都是類比。而「數位」只不過是用類比方式表示出來的數字本體罷了。

事實上,世界上只有類比的數字表示方式,沒有什麼絕對的數位化數字表示方式。

「這很怪哩!」

但就是如此。

手錶上的數字,實際上也是由晶片的電子訊號記錄並顯示,電子訊號就是類比的訊號(電位高低)。光碟上的訊息,是用溝槽的高低變化記錄的,這「高低變化」就是類比的。硬碟上的訊息,是用磁極的南極北極記錄的,磁極的南極北極就是類比的。

懂了這概念,你接下來的處理器理解之路,又邁進了一大步。

[轉自IThome]IT自救術-x86處理器的運作概念

IT自救術-x86處理器的運作概念

文/嚴立群 (記者) 2008-01-17

處理器並不是一開始就像今天這樣的、一顆晶片的樣子,工程師摸索了很久,才找到最有效率的處理器設計──現代處理器的「可程式」設計。

最早的電腦,使用的是「純電路」的設計。這種純電路設計的概念就是:一種用途,一種設計。如果你的電腦有了新的用途,就得有一個新的設計。

比方說,想要讓電腦計算圓周率的小數點後一千位,好的,工程師就會針對這件工作,用真空管和其他電子裝置做出一個電路,設法計算出圓周率小數點後的一千位數字。雖然早期電腦有著速度不快、不夠穩定、發熱量高、耗電量大以及佔用大量空間的問題,但這樣的工作應該還算是可以勝任。

但是,如果打算換個功能,像是,「讓電腦計算自然對數表」,好的,那工程師得另外設計一個全新的電路,重新組裝零件,以進行全新的運算。這當然不是一件很容易的事情,成本也高得驚人。

另外一個重要概念,則是「電腦乃是一種循序電路」的設計概念。
各位可以把電流想像成看得見的水流,並且以極慢極慢的慢動作流動,我們在電腦的這頭輸入電流,電流依序流經各晶片之後,會在另一頭跑出答案來。

處理器是個只接受電子訊號的可程式循序電路
專屬電路設計的電腦缺乏彈性,實用性不高,因此後來工程師們發現,設計一種萬用電路——也就是上期講的「處理器」,處理器裡面有著「暫存器」,這是可以用來進行各種運算的機構。記憶體裡面則存放等著被饋入暫存器裡面的程式碼和資料,依序執行各種運算。這樣的好處是:只要使用不同的指令和資料組合成「程式」,電腦將可以執行各種複雜的運算,大大提高實用性。

但是,就電路的角度來看,晶片只能接受高低電位不同的電流訊號輸入,並根據自身的設計,再輸出適當的電位訊號(運算結果)而已。

這概念很重要,請讓我重複再講清楚一點:

對處理器而言,它只是被設計成「接受電位變化不同的電流訊號之後,輸出對應的結果」。處理器其實並不懂所謂的「程式」、「數字」什麼的,那都是人類才懂的東西。工程師才是那個要設計處理器、晶片和電路,並設法讓代表程式的電位訊號輸入處理器後,跑出正確結果的人。

舉個例子,如果你對著Intel 8086說「MOV AH, 02」,它不懂的。但我們使用DEBUG這個小工具輸入這行指令時,這一小行字最後會化為電位高低不等的電流訊號,流到處理器裡面的電路,這段訊號會請處理器把02搬移到AH暫存器暫存著(當然,這些動作也是以一種電子訊號的形式被執行),並等待下一段指令的進行。

所以,「處理器是個只接受電子訊號的可程式循序電路」,是本期本欄內容的第一個重點,請牢記之。如果要廣義的引申,你認為「電腦就是個只接受電子訊號的可程式循序電路」也未嘗不可。

程式執行的「過程」簡介
所以,工程師設計處理器之時,一方面必須要想像,程式設計師會希望處理器有什麼樣的運算能力(通常就是「算術與邏輯運算」的能力啊!加、減、乘、除、且、反、或、互斥或……),一方面要想像,如何用循序電路做出這些運算的功能,讓程式設計師使用。

除此之外,整臺電腦還包括了其他附屬電路裝置。像是儲存待執行程式的「記憶體」,其實也只是將資料用電子訊號的方式存在晶片裡面,等待著往處理器「傳送」。有時候,處理器裡面暫存器的演算結果,也會寫回記憶體裡面儲存。這些「概念上」的演算,全都以電子訊號的方式,在組成電腦的電路裡面流動著。

反過來說,程式設計師不可能操作「電子訊號」來寫程式,所以早期的程式設計師大多只能熟記處理器的指令名稱和指令格式,用指令組合而成程式,再用「組譯器(Assembler)」將程式轉譯成「可執行檔」,這可執行檔就可由作業系統載入(處理器)並得到程式執行的結果(通常會顯示於螢幕上)。

DEBUG就是一個功能很少,但是還算夠用的迷你組譯器。

舉例來說,當你執行Windows,在「IE」瀏覽器的圖示上「連續按兩下滑鼠左鍵」時,程式會從硬碟載入到記憶體,然後部份程式碼會依序饋入處理器裡面,程式碼會由各種「處理器」能辨識的指令組成。等程式碼送入處理器中,利用暫存器執行完各種運算指令後,通常會有對應的結果顯示在螢幕上(通常是如此,只是程式有可能跑不出結果,或是當掉)。

不過,同樣的,其實這些運算,形式上都只是高低電位不同的電子訊號在電路上流動而已。

而且,其實程式設計師完全不懂所謂的電子訊號的流動也無妨,他們只需要研究「程式怎麼寫」就可以了。至於電子訊號怎麼流動才會跑出正確的結果,就是硬體工程師的事情了。

有哪些「基礎」得先打好
所以,從專業分工的角度來看,電腦工程師有兩種,一種是硬體工程師,一種是軟體工程師。

不過,各位並不是立志要當工程師而收看本欄內容(如果是,請不要看下去了,我不是工程師還能把你教到變成工程師,那我該改行當魔術師了),我們只是要研究處理器的原理而已。所以請各位看了上面的說明之後,來想想,要對處理器稍微有點了解,要學學哪些東西?

數碼系統的轉換
剛重複講了好幾次,處理器只能處理「電位高低不同的電子訊號」,也就是說,如果我們用0代表低電位,用1代表高電位,那處理器只能接受10110100這樣的電流訊號而已。

但是,一般人看到10110100這樣的符號,通常是看不懂的,所以一般的電腦專科教育,會教你做所謂的「10、16、8、2進位之間的互換」。通常來說, 2進位、8進位和16進位之間的互換相當容易,但偏偏人類是生了十根手指頭,所以為了要理解數位電路的常用符號,得學習不同數碼系統之間的轉換。

常用單位和常用符號
處理器用來處理大量的資料,但如果都只用2進位表示資料,紀錄時會變得相當冗長(你會看到諸如像是 10110100101010010100101010……的資料,看都看不完)。所以我們得用一些「科學記號」來表示資料。比方說,一個資料的最小單位(0或1)是Bit,8個Bit等於1個Byte,1000個Byte通常縮寫成1KB,1000個KB縮寫成1MB,1000個MB縮寫成1GB……,這些習慣寫法牢記之後才能搞清楚各種裝置的數量關係。

2進位算術運算
人類習慣用10進位演算,而電腦又只能接受2進位訊號,那我們能設計出一個方法,來二元的電腦電路模擬出10進位的演算嗎?

當然可以!

簡單的說,用電路模擬自然數的相加,方法倒是不難;但是如果要用電路設計出減法,就稍微困難一點了。乘法?除法?或是浮點數的四則運算?這些都可以用電路設計出來,但光是了解「理論上要怎麼做」就頗要費一番工夫就是。

數位邏輯運算
AND、OR、NOT、XOR……這些邏輯運算,也是電腦程式的運算中常用的。事實上,電腦能做的所有的其他運算,都是用幾個基本的邏輯運算去拼湊出來的。

一些基礎的原理
為何可以用數位邏輯運算模擬加法運算?甚至是模擬整個人類常用的四則運算,整數運算,以及浮點運算?因為這些都可說僅是機械運算,而根據「杜林機」的概念,這些演算都可以用模擬器的方法來完成,工程師會負責想出精巧、有效率的方式做出適當的電路模擬之,而我們要說明的就是這「工程」的部份。又或者,光是一個「數位」和「類比」的概念,很多人都還是分不清楚,這都是值得研究的內容。

電子電路設計
要怎樣才能實作出進行演算工作的電子電路?那就得學很多東西啦!從固態物理、電子學電路學、半導體與積體電路設計……,牽涉的相關專業學問可是不少。不過這門學問可說是臺灣的「顯學」(至少,在OEM或是Foundry的部份是吧!),好的電子電路設計(像是──iPod啊!)可以賺很多錢!

組譯器/編譯器使用
利用組譯器或編譯器工具,撰寫程式碼,並利用程式執行的反應,設法了解處理器的運作原理。

至少學習兩種語言
要寫程式,使用組譯器或是編譯器,你至少得學兩種語言,一種是組合語言,一種是高階語言(我會建議學C或C++語言)。不過,這裡不是要訓練你成為專業程式設計師,只是利用這些語言的執行結果去觀察處理器的行為模式。

本期結語:練拳不練功,到老一場空
我曾看過成龍的一部老電影,根據我殘缺不全的記憶,電影名喚《一招半式闖江湖》。電影裡面的老師父對成龍說,「你沒聽過嗎?『練拳不練功,到老一場空』。」呵呵,這話拿來對玩電腦的人來說,也是挺合適的。

要知道,今日這麼複雜的一臺電腦,像是家電一樣的電子產品,並非瞬間演化的結果,而是經過多年的進化而成。如今想要研究其原理,很多基本的「理論」往往不容易說的清楚──除非你有耐性慢慢學。

不過,老實說,如果真有耐心把上面講的這些單位、符號、演算、原理記熟了,面對於其他更複雜的產品問題,就會容易理解得多。因為,你已經知道這些產品的底層,也就是由這些元件和原理所組成。如果你願意「有耐性慢慢學」,這些原理有朝一日就可以變成你的「武器」。

不過,上期不是說要介紹DEBUG的用法嗎?很抱歉,我想,得等到適當的時間再介紹了!幸好,我們有得是時間呢!

[轉自iThone]IT自救術-保護電腦你「定期」該做的所有事

文/嚴立群 (記者) 2007-12-06

很多人平常不保養電腦,等到電腦壞了再來怨天尤人,其實,這是錯誤的態度,正確的作法是:你該定期保養電腦。

很久以前看過一個知名工具程式的廣告,內容主要是張照片,一個老人的臉,照片上的他牙齒稀稀落落的,都快掉光了。

請問「牙齒快掉光的人」和「工具程式」有啥關聯性?

原來,工具程式強調的是,「電腦沒使用工具程式定期保養,就好像人沒有每天刷牙一樣,是很不衛生的行為,遲早要『壞光光』的啊!」

問題是,如果你是一個電腦新手,如果要讓你的電腦安全、穩定,你知道定期保養電腦該做哪些事?

我建議的項目包括了:

●「Windows Update」或是「Microsoft Update」
●更新病毒碼
●掃描電腦病毒
●磁碟重組
●掃描硬碟健康

定期更新作業系統
Windows(或是其他作業系統)安裝好之後,會有許多的漏洞,而所謂的「駭客」會利用這些漏洞,輕則癱瘓你的電腦,重則損毀你的資料。幸好,作業系統的開發廠商並未坐視此事,他們不斷地修補這些破洞,並定期發布在網站上。

以Windows來講,在開始功能表裡面的「Windows Update」就可以讓使用者連到Microsoft官方網站,進行修補工作。這種修補方式,或可稱為「主動式修補」。使用者得主動開啟網頁,才能進行檢查和修補的工作。

另外一種修補方式,則是Microsoft主動「push」修補程式到你的電腦?面,此時電腦右下角「系統匣」裡面會出現一個黃色盾牌,這時候使用者必須在盾牌上,按下滑鼠鍵,把自動下載回來的修補程式安裝好。

我個人的習慣是,凡是有任何的修補程式,就把它裝上(即使我可能用不到)。不過,這個Windows Update還包括硬體的驅動程式更新,但是此功能有時會造成問題(安裝成舊版的驅動程式),所以關於硬體的部份,我就不太敢用這種方式來修正,而寧可選擇自己去原廠找新版驅動程式。

此外,Microsoft在你連上網路更新時,會執行「正版真品驗證(Windows Genuine Advantage,WGA)」,若你的Windows被驗證不是正版(但是不見得一定是盜版,有可能是安裝過程的錯誤置入序號),將會不能執行「主動式」的修補,但為了避免病毒橫行,Windows還是會選擇性的(依據設定)將某些重要的更新,用push的方式硬推到你電腦裡,以避免你電腦整個被癱瘓。

所以,看到系統匣的黃色盾牌,請不要忽視,裝一下吧!

如果我不是正版Windows使用者怎辦?
如果你不是正版的Windows使用者,並因此不能修補Windows的漏洞,怎麼辦?

當然是趕快去購買正版軟體,還能怎麼辦?

不過,有人也對於上網更新Windows的行為感到擔心,深怕Microsoft會竊取電腦裡面的資料。關於這點,我不能代替微軟公司來聲明「絕無此事」,但我個人意見只能說:我不擔心這點。畢竟,竊取他人資料是違法行為,我想Microsoft應該不會做這種事情。但是不更新Windows,會造成系統安全的問題。不一定是「事實」的事情,與其擔心,還不如解決「真的會造成問題」的問題。

有時候,安裝了新版的Windows修補,會導致一些軟體的執行「可能」會遇到問題。或者說,「使用者沒有確認我要安裝這些修補,別人不能代替我決定事情啊?」因此,使用者可以用Windows裡面的選項,來決定你要不要「接收來自Windows Update的更新」。

由於Microsoft不只一套產品需要修補,所以後來網站上還有所謂的「Microsoft Update」可取代Windows Update,像是Office也可以一併更新。關於這點,我的態度也還是「只要有更新,最好都安裝上去,免得電腦出事情」。

定期更新病毒碼無論是病毒的「特徵」還是「行為模式」,防毒軟體都需要不斷地更新,才能防堵最新的病毒。此外,防毒軟體的核心也偶爾需要修正,這些動作統稱「病毒碼的更新」。

上期其實已經講過,病毒碼的更新十分重要,在此就不再多言。但有一點要再強調:很多使用者用到防毒軟體都過期了,不知道要去「續購」病毒碼更新的時間延展,導致病毒碼很久都沒更新了,這當然是不好的事情,嚴重點就會讓你電腦「掛點」。

至於病毒碼的「定期」更新這件事情,倒是很容易,幾乎每一套防毒軟體都會自動更新病毒碼,只要你一上網(Internet),病毒碼就自動更新了。防毒軟體也可以讓使用者調整定期更新的頻率,一般而言都會每日更新。

定期掃描電腦病毒
按理來說,電腦裝上防毒軟體之後,所有存取的檔案都會在防毒軟體的監控之下,你就會一切安全了。

是這樣的嗎?

不,不完全是。

很多時刻,還有些漏網之魚,會鑽到你系統裡面,所以總有必要進行所謂的「徹底掃毒」,讓防毒軟體把電腦上所有儲存媒體(主要是硬碟)的每個檔案都檢查一遍。

多久一次才合理?

保險的作法,是一周一次。如果你嫌麻煩,我建議你一個月至少做一次。

我這裡要說明一下:完整掃描很花時間,通常都要花個「若干小時」才能做完,所以我通常的建議是,你把電腦開著,然後讓防毒軟體進行「完整掃描」以後,就可以去睡覺了(或是去進行你可以好幾個小時不使用電腦要做的事情)。尤其現在大家的硬碟容量都很大,掃個四到八小時也是家常便飯。

而且,就算是「病毒掃描」,也還有很多種類,使用者得視情況選擇。

有些軟體可以做「地毯式掃描」,即使是那些「不太可能有毒」的檔案也要照掃(像是,影片檔案大多不會有病毒,但是確實有些RMVB檔案傳說可以有漏洞加以利用),這個掃描方式會掃最久;有的則是「智慧掃描」,只掃描最必要的幾種檔案類型,這方式的掃描時間則是「適中」,也應該是大部分防毒軟體的預設掃描設定;還有一種「只掃描核心檔案」的方式,最省時間。一般而言,看你打算花多少時間做完整掃描而選擇掃描種類,越完整的掃描,安全性越高,但花的時間也越久。

定期磁碟重組
一般人常會抱怨電腦越跑越慢,而電腦變慢的其中一個原因乃是磁碟的「磁區碎裂」。但所謂的「磁區碎裂」,並不是指磁碟會像玻璃杯一樣,掉到地上就破碎了。磁區碎裂是一種狀態,不是真的有東西碎了。

當你儲存檔案,檔案的內容會占用硬碟的磁區。通常,Windows會盡量用連續的磁區儲存一個檔案的內容。但是,當你刪除一些檔案,並且再度儲存其他的檔案之後,問題就來了。

檔案的大小很少有「每個都一樣」的情況,因此當你刪檔、存檔的動作多了之後,Windows不再有辦法用連續磁區去儲存檔案的內容,檔案就被迫存在一些不連續的磁區,這就被稱作「磁區碎裂」或是「硬碟碎裂」。

想像一下,當你的一個很大的檔案被存在好幾個不連續的磁區,當硬碟在讀取檔案時,磁頭就得「來回奔波」,導致讀取檔案的速度就變慢了。因此,就有所謂的「磁碟重組軟體」可幫你把檔案盡量的恢復成連續的狀態,這會加快電腦的效能。

Windows作業系統本身就有內建磁碟重組軟體,不過,系統送你的功能總是少一點。目前最知名的軟體是Raxco公司的PerfectDisk,目前最新版本是8.0,另一套則是O&O Defrag 10,有興趣的讀者可以到網站找找試用版,直接用看看。

定期掃描硬碟的「健康程度」
硬碟的「健康程度」其實有兩種,只是一般人並不清楚。

「真的假的,『健康程度』還有兩種?」

是的,而且,嚴格的分法還不只兩種,我會認為有三種,但先講比較淺的兩種就好。

硬碟是用來儲存檔案的,所以「檔案結構的健康程度」算一種,而硬碟的「磁區表面健康程度」也算一種。各位切記,這兩種健康程度「都重要」,即使你不是初學者,你可能也該知道一下。

由於「檔案結構的健康程度」這種東西是和作業系統相關的,所以要檢查檔案系統的健康程度,目前我只依靠Windows內建的工具。以前的 Windows 95/98/Me時代,玩家還可以使用Norton系列的磁碟檢查工具(聽過「NDD」嗎?Norton Disk Doctor),那是因為FAT16/FAT32檔案系統比較「簡單」,所以還有工具軟體可以用,但NTFS「小複雜」,不再有比較知名的檢測軟體了(就算有,我也沒用過,不好意思讓各位失望了)。

我的習慣,會到檔案總管裡,在磁碟圖示上按滑鼠右鍵選內容,然後選「工具」標籤底下的「檢查錯誤」(這是Vista的圖片,Windows XP不知是否名稱不同)。不過,這個檢查頗花時間,一樣,請選你不用電腦的一段長時間來作磁碟檢測,會比較好。

注意到這裡有兩個項目,一個是「自動修正檔案系統的錯誤」,這就是指我說的「檔案結構的健康程度」;另一個是「掃描和嘗試恢復損毀的磁區」,這個就是要檢測我說的「磁區表面健康程度」。

一般而言,電腦出問題(不穩定,怪異的連續當機,開不了機……),我都會先做磁碟健康的檢修,而且是兩種檢測都做。不過,你在C:磁碟做這兩種檢測的其中一種,Windows應該都會跳出一個對話盒,跟你說它「無法在磁碟使用中檢查磁碟」。

這怎麼辦?

其實這是合理的狀況,尤其是C:磁碟通常作為「開機磁碟」,有很多檔案是在使用中,無法檢測它是否正常,所以你只要「排定磁碟檢查」,重開機後,系統會在所謂的「命令列模式」(或稱為console模式)做檢查。雖然沒有美美的畫面,但這可是救命的事情,非這麼做不可。

本期結語:平常做好保養電腦才能久活
那如果,因為平常你沒有定期檢查,導致「我已經開不了機了」,怎麼辦?

如果是我,我通常會先加以嘲諷之(你看你看,平常不刷牙吧!牙齒掉光了才來後悔……),這通常於事無補。不過,還是有一些比較複雜的方法,可以用來拯救你的電腦(主要就是你的硬碟)。

不過,方法很多、很雜,也不是很好懂。有時只是需要特殊的工具(得花錢買),有時你得懂DOS指令(在命令列模式工作),有時你甚至得找一些「灰色的工具」才行。

灰色的工具我不會教你用,但下期我會教你用一些「正常顏色,但是小複雜」的工具。

18種傷害電腦的方式

18種傷害電腦的方式

1、大力敲擊Enter鍵
  這個恐怕是人所共有的通病了,因為Enter鍵通常是我們完成一件事情時,最後要敲擊的一個鍵,大概是出於一種勝利的興奮感,每個人在輸入這個Enter鍵時總是那大力而爽快地敲擊。本人的多個鍵盤就是這樣報廢的,最先不看見字的是AWSD(呵呵,心知肚明),最先不能使用的按鍵卻是Enter。
  解決辦法:解決方法有兩個,第一是控制好你的情緒,第二是準備好你的錢包。我選的第二個,有時候好心情是錢買不來的,你呢?

2、在鍵盤上面吃零食,喝飲料
  這個習慣恐怕是很普遍了,我看到很多人都是這樣的,特別是入迷者更是把電腦台當成飯桌來使用。我想你要是拆一回你的鍵盤,也許同樣的行為就會減少的,你可以看到你的鍵盤就像水積岩一樣,因你平時的習慣,保留了很多的“化石”,飯粒、餅乾渣、頭髮等等比比皆是,難怪有人說:公用機房裏的鍵盤比公廁還髒。同時這樣的碎片還可能進入你的鍵盤裏面,堵塞你鍵盤上的電路,從而造成輸入困難。飲料的危害就更加厲害了,一次就足以毀滅你的鍵盤。就是你的鍵盤僥幸沒有被毀滅,恐怕打起字來,也是粘粘糊糊很不好過。
  解決方法:避免在鍵盤上吃東西,要不然像我一樣買一個防水的PHILIPS鍵盤,然後每過一段時間就給他打掃衛生,擦澡(雖然這樣還是很髒的);你要是腰包更加飽的話,可以考慮半年換一個鍵盤(我從來不建議用差的鍵盤,那可是關乎健康的問題)試試,應該情況會好一些。還有記得給你房間買一個飯桌了。  

3、光碟總是放在光碟機裏(還有看VCD時,暫停後出玩或吃飯)
  很多人總是喜歡把光碟放在光碟機裏,特別是CD碟,其實這種習慣是很不好的。光碟放在光碟機裏,光碟機會每過一段時間,就會進行檢測,特別是刻錄機,總是在不斷的檢測光碟機,而高倍速光碟機在工作時,電機及控制部件都會生很高的熱量,此光碟機廠商們一直在極力想辦法解決。
  雖然現在已有幾種方法能將光碟機溫度控制在合理的範圍內,但如果光碟機長時間處於工作狀態,那麼,即使再先進的技術也仍無法有效控制高溫的發生。熱量不僅會影響部件的穩定性,同時也會加速機械部件的磨損和激光頭的老化。所以令光碟機長時間工作,實在是不智之舉,除非你想把你的光碟和光碟機煮熟。
  解決方法:盡量把光碟上的內容轉到硬碟上來使用,比如把CD轉化為MP3的,如果你是一個完美主義者,那就用虛擬光碟機的形式管理你的常用CD碟吧;遊戲則盡量使用硬碟版的;大多數光碟版的遊戲,都可以在網上找到把光碟版轉化硬碟版的軟體;不然就同樣采用虛擬光碟機的形式。網上有很多虛擬光碟機可以下載,怕麻煩的話可以用國的《東方光碟機魔術師3》或《VirtualDrive7.0》, 界面很簡單,而且沒有了E文的問題,很好上手。

4、關了機又馬上重新啟動
  經常有人一關機就想起來光碟沒有拿出來,或者還有某個事情沒有完成等等,筆者就是其中一個,可以說有同樣毛病的人還是很多的。很多人反應迅速,在關閉電源的剛剛完成就能想起來,然後就伸出手來開機;更有DIY好手,總是動作靈敏,關機,十秒鍾處理完故障,重新開機;殊不知這樣對電腦危害有多大。
  首先,短時間頻繁脈沖的電壓沖擊,可能會損害電腦上的集成電路;其次,受到傷害最大的是硬碟,現在的硬碟都是高速硬碟,從切斷電源到盤片完全停止轉動,需要比較長的時間。如果盤片沒有停轉,就重新開機,就相當於讓處在減速狀態的硬碟重新加速。長此下去,這樣的沖擊一定會使得你的硬碟一命歸西的。
  解決辦法:關機後有事情忘了做,也就放下他;一定要完成的,請等待一分鍾以上再重新開機,要不就在機子沒有斷開電源的時候按下機箱上的熱動鍵。要是你以上的方法都做不到,為了你愛機的健康,我建議你在電腦桌上係一個繩子,以便用來綁住你的手一分鍾以上。

5、開機箱蓋運行
  開機箱蓋運行一看就知道是DIY們常幹的事情。的確開了機箱蓋,是能夠使得CPU涼快一些,但是這樣的代價是以犧牲其它配件的利益來實現的。因為開了機箱蓋,機箱裏將失去前後對流,空氣流將不再經過內存等配件,最受苦的是機箱前面的光碟機和硬碟們,失去了對流,將會使得他們位於下部的電路板發生的熱量變成向上升,不單單散不掉,還用來加熱自己,特別是刻錄機,溫度會比平時高很多。
  不信你比較一下開不開機箱蓋的光碟機溫度。開機箱蓋還會帶來電磁輻射,噪音等危害,而且會使得機箱中的配件更加容易髒,帶來靜電的危害,並阻礙風扇的轉動。同時,讓其他隱患有機可乘,比如你在電腦前邊喝茶邊觀看一部片子,一個爆笑的鏡頭使你將口中的清茶悉數噴進了敞開的機箱內……
  解決辦法:很簡單,給你機箱蓋鎖上鎖頭,然後把鑰匙寄給我。要是怕超頻不穩定,就不要超頻了,現在的CPU夠快了,在市場上的主流CPU就夠用了。要是你用的是老掉牙的CPU,我建議你還是換一個的好,換一個也就是幾百元左右(賽揚D或P4、AMD也都不錯)何必受提心吊膽和電磁輻射、噪音的苦?還是那句話:快樂是用錢買不到的。

6、用手摸屏幕
  其實無論是CRT或者是LCD都是不能用手摸的。電腦在使用過程中會在元器件表面積聚大量的靜電電荷。最典型的就是顯示器在使用後用手去觸摸顯示屏幕,會發生劇烈的靜電放電現象,靜電放電可能會損害顯示器,特別是脆弱的LCD。
  另外,CRT的表面有防強光、防靜電的AGAS(Anti-GlareAnti-Static)塗層,防反射、防靜電的ARAS(Anti- ReflectionAnti-Static)塗層,用手觸摸,還會在上面留下手印,不信你從側面看顯示器,就能看到一個個手印在你的屏幕上,難道你想幫公安局叔叔們的忙,提前提取出傷害顯示器“凶手”的指紋嗎?同時,用手摸顯示器,還會因為手上的油脂破壞顯示器表面的塗層。
  LCD顯示器比 CRT顯示器脆弱很多,用手對著LCD顯示屏指指點點或用力地戳顯示屏都是不可取的,雖然對於CRT顯示器這不算什麼大問題,但LCD顯示器則不同,這可能對保護層造成劃傷、損害顯示器的液晶分子,使得顯示效果大打折扣,因此這個壞習慣必須改正,畢竟你的LCD顯示器並不是觸摸屏。
  解決方法:在你的顯示器上貼一個禁止手模的標志,更不能用指甲在顯示器上劃道道;想在你的屏幕上“指點江山”,就去買一個激光指定筆吧。強烈的沖擊和振動更應該避免,LCD顯示器中的屏幕和敏感的電器元件如果受到強烈沖擊會導致損壞;顯示器清洗應當在專門的音像店裏買到相應的清洗劑,然後用眼鏡布等柔軟的布輕輕擦洗。

7、一直使用同一張牆紙或具有靜止畫面的螢保   無論是CRT或者是LCD的顯示器,長時間顯示同樣的畫面,都會使得相應區域的老化速度加快,長此下去,肯定會出現顯示失真的現象。要是你有機會看看機房裏的電腦,你就會發現,很多上面已經有了一個明顯的畫面輪廓。何況人生是多姿多彩的,何必老是用同一副嘴臉呢?
  解決措施:每過一定的時間就更換一個主題,最好不要超過半年。平時比較長時間不用時,可以把顯示器關掉。要是你沒有這樣的習慣,可以在顯示屬性的屏幕保護那裏設定好合適的時間,讓WINDOWS幫你完成。

8、把光碟或者其他東西放在顯示器上。
  顯示器在正常運轉的時候會變熱。為了防止過熱,顯示器會吸入冷空氣,使它通過內部電路,然後將它從頂端排出。不信你現在摸摸你放在上面的光碟,是不是熱熱的象烙餅?若你總是把光碟或紙張放在顯示器上頭;更加誇張的是讓你家貓咪冬天時在上頭蜷著睡覺,當顯示器是溫床,這會讓熱氣在顯示器內部累積的。那色彩失真、影像問題、甚至壞掉都會找上你的顯示器。
  解決辦法:如果你想讓顯示器保有最好的畫質,以及延長它的壽命,趕快叫醒你的貓咪,讓它到別處去睡吧。並把你的“烙餅”收到光碟袋裏去。

9、拿電腦主機來墊腳
  如果想要殺死你的台式電腦,那麼開車帶它去越野兜風,或是背著它去爬山、蹦迪,那樣會更快一些;你的這種方法震動太小了,要比較長的時間才能出成績。如果你願意堅持下去,估計取得的第一個成績就是發生一出個圓滿歸西的是硬碟吧,死因是硬碟壞道。
  解決方法:把你把腳架在電腦上的照片作為你的桌面,讓你看看那一個姿勢有多難看,這樣你就不會把腳再次伸向主機;要不然就把你的電腦發票貼在顯示器上,看著發票上的金額,你應該不會無動於衷吧。如果上面的方法都不能制止你的行的話,我想你就該考慮去買一個帶有腳扣的椅子了。

10、電腦與空調、電視機等家用電器使用相同的電源插座
  這是因為帶有電機的家電運行時會生尖峰、浪湧等常見的電力汙染現象,會有可能弄壞電腦的電力系統,使你的系統無法運作甚至損壞。同時他們在動時,也會和電腦爭奪電源,電量的小幅減少的後果是可能會突然令你的系統重置或關機。
  解決方法:為了你的電腦不挨餓或者是吃的“食物(電力)”不幹淨,首先應使用品質好的電腦開關穩壓電源,如長城等品牌。其次,對於一些電力環境很不穩定的用戶,建議購買UPS或是穩壓電源之類的設備,以保證為電腦提供潔淨的電力供應。還有就是優化布線,盡量減少各種電器間的影響。  

11、給你的電腦抽二手煙
  就像香煙、雪茄或微小煙粒會傷害你的肺一樣,煙也可能會跑進你的軟碟並危及資料。煙霧也可能會覆蓋CD-ROM、DVD驅動器的讀取頭,造成讀取錯誤。煙頭煙灰更有可能使得你的打印機和掃描儀質量大大的下降。
  解決方法:要保護你的系統和你自己的最佳方式,就是不要抽煙。如果你就是戒不掉抽煙這個習慣的話,到外面去抽,或在電腦四周打開空氣清新器吧!當然更不要把你的鍵盤當煙灰缸用。  
  看完了硬件方面的問題,我們來看看在軟體方面的問題吧。

12、不停的更換驅動程序
  很多的DIY很喜歡不斷的更新驅動程序,雖然更新驅動程序有可能提升性能和兼容性,但是不適當的新版本可能會引起硬件功能的異常,在舊版本運轉正常的時候建議不要隨意升級驅動。
  先仔細閱讀驅動的README文件,對你有好處。就是像顯卡這樣更新換代迅速的硬件最好不要總是追新,不要隨便使用最新版的驅動程序,應該使用適合自己硬件情況的驅動程序,因每一代的驅動程序都是針對當時市面上最流行的顯卡芯片設計,老芯片就不要隨便使用新的驅動,更不要隨便使用測試版的驅動,測試版的驅動就先留給網站的編輯們去測試他們的系統。
  解決方法:到專業的網站上去看看新驅動的介紹,我覺得最保險的辦法是:顯卡最多用芯片推出半年後的驅動;主板最多用芯片組推出6-9個月的驅動;聲卡等最多用推出一年後的驅動;再往後的驅動就不要用了(除非你試過前面的驅動統統有問題)。

13、裝很多測試版的或者共享版的軟體
  追新一族總是喜歡在自己的機子用上最新的軟體,和驅動程序一樣,更新程序有可能提升性能、增加功能和兼容性,但是不適當的新版本可能會引起系統的異常。特別是測試版的程序,更是害處更多,既然沒有推出正式版,就說明該軟體還存在著很多不確定的BUG,這些小蟲就像定時炸彈一樣,隨時可能在你的系統中爆炸,損壞你的系統。
  共享版的軟體有一些過一段時間(或次數)就會失效,要是你的系統通過共享版軟體更改了某方面的功能,而共享版軟體又因失效而無法運行,那麼你的系統就不能回到你想要的狀態了;還有就是使用了共享版的軟體來建立的資料或者文檔,因共享版軟體失效,而無法打開。所以安裝共享版時應當注意共享版提供使用的次數或者時間,以免無法還原系統和丟失資料。
  解決辦法:如果不是一定要使用新版本才能解決問題的話,盡量使用最新的正式版的軟體,測試的工作就留給專家們去完成吧。盡可能注冊你的共享版軟體,不然就要注意共享版軟體的限制,以免丟失重要的文件或者損害系統。

14、在系統運行中進行非正常重
  在系統運行時,進行非正常重開(包括按機箱上的重置鍵、電源鍵和Ctrl Alt Del),可能使得系統丟失系統文件、存盤錯誤以及丟失設置等。本來windows是提供了磁盤掃描工具,可以糾正部分出錯的文件,但是因為掃描需要一段比較長的時間,很多人都會中斷他的工作,經常出現這樣的情況,還有可能使得硬碟上的數據的出錯幾率和次數大大增加,從而使得整個系統崩潰。
  解決方法:盡量使用比較穩定的系統,建議CPU頻率在750MHz和內存在256M以上的用戶使用WINXP的系統,其他的可以考慮WIN2000,還有就是最好把硬碟轉化NTFS的格式,它比FAT32的格式要更加安全,不容易出錯。還有就是FAT32和FAT16的用戶,最好讓磁盤掃描工具執行完它的工作。當然最好的辦法是找出死機的原因,杜絕此類現象的出現。

15、不掃描和整理硬碟
  經常看到很多人的硬碟裏充滿了錯誤和碎片,總是覺得很不好受,其實那些東西不但會使得你的系統出錯的幾率加大,還有可能讓你的系統變的很慢,甚至無法運行。其實很好理解這樣的壞處,就像你的房間東西到處扔,還有的纏在一起、甚至損壞了,當然找起東西來效率很低,碰到纏住的,還要先解開;甚至找到了也用不了,因為他們是壞的。
  解決方法:平時記得給你硬碟打掃衛生,每過一段時間就應該清理一下硬碟,並且進行整理。如果是添加刪除操作比較多的用戶,應當一個月整理一次,普通的用戶可以三個月整理一次。WINDOWS自帶的磁盤整理工具效率很低,可以使用VoptXP、諾頓等工具來提高速度。  
16、虛擬內存不指定範圍
  虛擬內存顧名思義就是在硬碟上用硬碟的空間模擬內存,以保證大過系統內存的內存請求,保證程序的運行。一般WINDOWS默認是由WINDOWS自己管理虛擬內存的大小,這樣的話有兩個壞處:首先每次請求的數值並不一致,所以系統會隨意在硬碟分區上劃出一個地方,存放臨時文件,過後又沒有及時刪除,使得硬碟上的碎片增多,從而影響系統的效率。其次,一般WINDOWS都是指定自己所在的硬碟做為虛擬內存的存放的默認盤,但是由於很多的用戶總是把程序裝在同一個分區下,使得該分區的空間越來越小,也就是說虛擬內存能使用的空間在減少,少於一定的程度時,將不能執行大型的軟體,甚至無法進入系統。
  解決方法:應當手動指定虛擬內存的位置和大小,原則上指定系統虛擬內存的大小512M以上好(最小和最大空間一樣,以保證WINDOWS不會改變位置),位置看看那個分區有多余的空間就行了。

17、不用卸載,而是直接刪除文件夾
  很多的軟體安裝時會在注冊表和SYSTEM文件夾下面添加注冊信息和文件,如果不通過軟體本身的卸載程序來卸載的話,注冊表和SYSTEM文件夾裏面的信息和文件將永遠殘留在裏面。他們的存在將會使得你的系統變得很龐大,效率越來越低下,超過你的忍耐限度,你就不得不重裝你的系統了。
  解決辦法:刪除程序時,應當到控制面板中的刪除添加程序去執行(你可以做一個快捷方式在桌面上就方便多了),或者在開始菜單欄中找到程序的目錄裏的刪除快捷方式,通過它來刪除程序。還有就是盡量使用綠色免安裝的軟體。

18、加載或者安裝太多同樣功能的軟體
  同樣功能的軟體勢必會行使相同功能的職責,從而引起爭端。我認相同功能的軟體應當有所取捨,選擇最適合自己使用習慣的軟體。特別防病毒軟體應當選擇一個就可以了,而不是同時加載很多個在系統後台,加載太多會生消耗太多的系統資源、軟體沖突的弊端,在發現病毒時,還有可能出現因“爭殺”病毒而引起系統崩潰的麻煩;就單單對著多個彈出的窗口,分別進行處理,也是一個麻煩。
  解決方法:盡可能“從一而終”,不要太花心,選擇一個適合自己使用習慣的軟體,其他的可以卸載掉;正確對待防病毒軟體,應當選擇一個病毒庫更新速度快的防病毒軟體,並及時將自己的病毒庫更新到最新的病毒庫,而不是安裝多個防病毒軟體。  
  人無完人,知錯就改就是好同志。我們要改正平時的一些不良的用機習慣,畢竟電腦是我們的好夥伴,不要因為某些錯誤習慣而一再傷害我們的朋友。

2008年2月23日 星期六

[轉自iThome]IT自救術-x86處理器的結構

IT自救術-x86處理器的結構

文/嚴立群 (記者) 2008-01-10

既然是要研究處理器的「原理」,所以我們得找個「簡單的」來開刀。就類似可憐的青蛙總是要在生物課被解剖一樣,你總不好一開始就解剖大野狼吧!

要了解個人電腦的運作原理,我們決定先研究處理器的原理。而為了研究處理器的原理,我們挑選了所謂的「Intel x86」處理器作為研究的對象。

為何不挑別種處理器?x86處理器是個好的研究對象嗎?

從「幾乎人手一臺」這個角度看,x86是個很讚的研究對象。

有人會說,「x86的架構不夠優雅」、「x86就像是用膠水、剪刀等工具去拼貼出來的怪物」、「x86的概念很落後」、「x86有很多歷史的包袱」。老實說,他們說的都對。

但是,so what?

又沒人要你跟它結婚?我們只是研究一門學問而已。x86處理器雖然不夠完美,可看在它可是目前地球上數量最多的處理器的份上,就用它來當作研究的對象,實在很方便。所以,關於「美學」和「神學」的部份,暫時就不要理會了。

x86的「由來」
處理器早期並不是一顆晶片。早期的電腦,CPU是由一大堆晶片組成,專司「運算」的功能。一大堆晶片,占用很大的空間,真空管閃爍著奇異的光芒並發出高熱,計算的結果用燈號顯示。不過,這種畫面我只看過照片,沒有親眼見過,也許某些紀錄片上出現過吧!

直接跳到近代,Intel製造了所謂的「微處理器」。Intel在處理器市場算是先驅,第一個產品稱為4004,後來又陸續推出了8008、8080、 8086、8088……。不過,真正讓Intel大紅大紫的產品,當然是首先被IBM選用,拿去製造IBM PC的「8088」。

Intel 在8088之後,陸續推出了很多後繼產品,像是80186/188、80286、80386和80486。這些產品(除了 80186/188以外)都大量使用在IBM 相容PC電腦上。由於太受歡迎了,因此有許多公司就開始了「仿製」的工程。幾個比較有名的,包括了NEC(V20、V30)、AMD(AMD的286、 386和Am486等等)、Cyrix……。臺灣的聯電也做過,不過很快就收掉了這個事業(原因很難說,但是很快就收得一絲痕跡都不留)。

使用編號來命名晶片,是電子業的慣例。電子產品使用各家的晶片組裝,而相同(或是類似)編號的晶片會有幾乎一模一樣的性能,也就成為眾所周知的事情。所以,大家仿製Intel的處理器,也會刻意(如果膽子夠大)使用x86的編號。但這對Intel來說,可不是件令他們開心的事情。不幸的是,由於編號不能註冊,Intel也無法主張他們有80x86的商標使用權。因此,80486系列處理器之後,Intel幫處理器改名為Pentium,沿用至最近。目前 Pentium處理器已經陸續被更高階的「Core」系列所取代,但Pentium名稱仍在中、低階產品中繼續使用。

不過,由於80x86這名稱被使用得太廣泛,因此,這系列處理器就被廣泛的稱為x86處理器。相關的產品(作業系統、編譯程式……)也都會冠上x86字眼。舉例來說,Windows Vista其中一個就是「x86版本」。

處理器的「名稱」和「相容」間的關係
多年以前,當Intel把當時他們最新推出的處理器命名為Pentium,並註冊為商標之後,其他廠商就不「方便」再抄了。有一種方法是:那使用原本應該用的「586」當處理器名字(反正你Intel不用,那我用)。另外的方式則是:我也取個自己的名字,但是設法讓大家知道,我的處理器和 Intel相容。

當年市場上的兩個主要x86相容處理器製造廠商,一個是Cyrix,它就曾經推出過所謂的Cyrix 5x86和6x86處理器;另一個就是現在還頗知名的AMD,它當年則推出過所謂的5K86。你可以說,因為競爭激烈,廠商無所不用其極地想玩出自己的一片天。

這時,我們可以給各位一個很重要的概念,稱為處理器的「相容」。

處理器只是個晶片,接收電子訊號,然後傳出電子訊號。這些電子訊號通常有代表意義,送進來的是程式和資料,傳出去的是運算結果。Intel設計出一個處理器,能夠做訊號的處理(也就是接受「輸入」並提供「輸出」);你如果能做出一個處理器,能夠達到和模仿對象一樣的輸入/輸出結果,那就是「相容」。

請各位先複習一下上期講的,構成處理器的兩個元素,一個是「暫存器」,一個是「指令」。然後,請各位再看看這期的程式範例,一樣的印字程式。

通常,處理器有它的暫存器和專屬的指令,程式得使用該處理器專屬的暫存器結構和指令,才能正常運作。以印字程式為例,「MOV AH, 02」這行程式碼,執行時會變成「電子訊號」送到處理器裡面。「相容處理器」有什麼特色?很簡單,它們只要能處理一樣的程式碼,能夠輸入相同的電子訊號並得到一樣的程式碼執行效果,那就是「相容」。

不過,硬體是個很複雜的東西,老實說要做到「100%相容」真不是件容易的事。只不過利之所趨,還是有人有辦法可以做出相容處理器,並且執行各種程式,真是很厲害。

x86與x64的簡單說明
當然,在競爭者環伺的情況下,Intel只有設法不斷推出更新、更快、更好的產品以設法擊敗競爭者。所以早期的處理器有所謂的16位元處理器,像是8086/8088和80286。

所謂16位元,這「位元」指的是暫存器的寬度(一般說法是如此)。暫存器是「暫存資料,供處理器用在運算用途的空間」,因此它的寬度(空間大小),會影響資料處理的速度和精密程度。一般而言,16位元處理器的暫存器寬度,實在是太小了,因此在80386推出時,Intel使用的是32位元暫存器架構,整個指令集也因此大幅翻新。

這個架構,到現在仍是所有x86處理器和應用程式使用的主要架構,可說是夠偉大囉!

所以,目前只要提到x86架構,大多是指這個32位元的Intel處理器架構,Intel自己則是使用「IA-32」這樣的名稱。

AMD 為了要贏過Intel,並提供自己的處理器一個更優的特點,在幾年前則推出了所謂的64位元架構,使用在自己的AMD Athlon處理器上。只是後來Intel處理器也全面支援這個架構,並使用自己的「IA-64」或是「EM64T」的名稱。目前新出世的處理器,大多支援此架構了。而Microsoft最新推出的Windows Vista,也因此有所謂的Vista x86和Vista x64兩個版本。簡而言之,「x86」就是32位元架構,而「x64」則是指64位元架構。這樣的說法不算精確,乃是「約定俗成」,但是一般都是如此稱呼,各位知道一下並無壞處。

此外就是,x86處理器升級到64位元之後,通常在設計上就是「雙模」,既可以跑32位元程式,也可以跑64 位元程式。不過,這都得在64位元作業系統下才能發揮。這部份的課題稍微複雜,我現在僅簡單跟各位宣布:目前64位元的應用程式主要都是「專業的繪圖、數學軟體」,一般應用軟體就很少了。

那有沒有128位元處理器?

我聽過一個說法,64位元處理器就夠地球人移民到織女星了,所以128位元處理器應該是不用想太多。

x86暫存器架構
當你在命令列使用DEBUG,無論你的處理器是Pentium III、Pentium 4還是Core/Core 2 Duo,這時它的行為都會像是個8086。
太好了,因為這樣夠單純,所以我們來看看8086的暫存器架構。

再次強調,所謂的「暫存器」就是可以「暫時地記住數字」,方便處理器進行演算用的空間而已,「暫存一下數字」就對了。早期的處理器暫存器數量很小,寬度也不寬。8086已經算是先進的產品!有十四個主要的暫存器,並有六種不同的種類:

一般用途暫存器
8086 共有四個General Purpose Register,稱為AX、BX、CX、DX。不過,ABCD可不是因為「它們是英文的前面四個字母」而已,A可以視為是「Accumulator」,累積器(就是最一般、最常用的用途的意思);B可視為是「Base」,基底的意思(基底是什麼意思?先別管好了);C通常用來當作「Counter」,計數器;D通常表示「Data General」,「一般存放資料用途」的意思。

一般用途暫存器雖然是「可以萬用」,但實際上不是每個都可以的,像是CX,大多就真的用來做計數器,並不會隨便亂用之,所以8086的一般用途暫存器其實很少的。

節區暫存器
執行程式時,x86的設計是讓程式碼中分區存放程式、資料等等,其中的管理會依靠所謂的「Segment Register」。8086共有CS、DS、SS和ES等四個節區暫存器。

堆疊暫存器
SP和BP是Stack Pointer暫存器,通常是用在「程式碼堆疊的控制」上頭。

喔,堆疊是啥?呵呵,也一樣,先別管吧!等你寫程式時,用到了才能比較理解。

索引暫存器
SI和DI是所謂的Index暫存器,可以用來當作像是大量記憶空間(程式裡面的陣列)中,像是A[1]、A[2]的索引指示用。

旗標暫存器
Flag Register主要是記錄程式執行的一些「狀態」,很像是「信號機」。利用這些旗標狀態的變化,程式設計師才得以控制程式的流程。

程式計數器
IP(Instruction Pointer)主要就是記錄程式碼目前執行位址的暫存器。

本期結語:只能從實踐中漸漸了解
其實,從「文字說明」中,各位很難了解處理器運作的原理。你得從程式的「實作」中,才能真正了解到底暫存器是怎麼一回事?堆疊、指標又是怎麼運用?老實說,無論是文書處理還是該死的病毒,都是用這些程式原理去撰寫的,不了解之,你就無法了解電腦的運作原理了。

下期我想先從DEBUG的教學,來教各位認識x86處理器的簡單架構。

[轉自iThome]IT自救術-學電腦先學寫程式

IT自救術-學電腦先學寫程式
文/嚴立群 (記者) 2007-12-27

我認為,想要知道電腦大部分問題的原因,了解電腦的「秘密」,沒有捷徑,你得學怎麼寫程式──即使是只懂一點點也該試著去學。

用了這麼久的電腦,我必須承認我不是專家,但勉強是個通才,通才的特色是「啥都只懂一點點」,所謂「樣樣通樣樣鬆」。所以,接下來本欄的內容,我一直想著該寫些什麼?

「進階的電腦學習」該學些什麼?

作為一份專欄,我想本欄的讀者應該沒人打著「只看專欄內容就可以變成專家」的主意吧!既然如此,在此就請各位以「只打算變成『稍微多懂一點』的心態」來研究電腦這東西,至少你恐怕沒法僅看本欄內容就變成超級專家。

學院派的專家學什麼
首先讓我們來研究一下,「學院派」的「資訊專家」是如何養成的。

假設你是個高中生,考上了大學的「資訊工程系」,那我們可以假設:經過了四年的大學學習生活後,你會成為一個「資訊專業人員」。(當然,這是在如果你沒有玩樂的太過頭,且有用功讀書的前提下才成立的。)

那麼,資訊工程系上些什麼課來培養資訊專業人員呢?雖然我應該可以背得出來,但我也還是去查了一下臺大資訊工程系的課表,課程大致的分類如下:

● 共同科目
通常包含了「國文」、「英文」、「歷史」、「體育」

● 數理基礎
通常有「物理」和「微積分」、「機率」、「統計」、「線性代數」和「離散數學」

● 資訊工程基礎
包含了「計算機概論」、「程式設計」、「資料結構」、「演算法則」

● 軟體系統
「計算機組織」、「系統程式」、「作業系統」、「編譯程式」、「資料庫系統」

● 硬體結構
「計算機結構」、「數位電子/電路」、「數位系統設計」
許多學校會有更多的專業科目讓大四、研究生選修(像是「人工智慧」、「遊戲程式設計」……),讓學生多方研習自己有興趣的領域,為將來的專業生涯紮下更深厚的基礎。不過這些都是比較嚴肅的電腦專業,和我們一般生活的「電腦柴米油鹽醬醋茶」距離頗為遙遠。

既然我們離高中(甚至離大學)已經很久了,那就別管這些吧!知道一下科目名稱不壞就是。

今後以「理解電腦」作為研究目標
那我打算教什麼?離散數學?呵呵,大家別擔心,因為本人的數學程度不佳,所以我也不適合教這種高等數學(因為我也不會,要是我會我也想教)。我想做的,只是想找一個「學習標的」,讓讀者「從學這東西的過程中,逐漸理解電腦的一切。」

這就會有幾個問題:
● 通常「理解」得下更多苦工
如果我們要儘可能理解電腦的一切,那很抱歉,很多的學習項目是單調、無聊、沉悶而痛苦的。但如果你想要理解,就得去學,某些東西甚至得熟悉到會背誦,或是變成你直覺的一部份,因為我們的目標是要「理解」,而不只是「知道」而已。

● 理解的時程往往不能盡如人意
學習的過程是循序的,但是理解的過程卻不一定。有時本人只是用自己認定的邏輯順序去介紹某些項目,但是你不會一下就看懂全部。有時候你得慢慢想,等到「某一天」來臨時才能融會貫通。

● 千萬不能用「見樹不見林」的方式去學任何東西
我認為「單一項目」的學習容易造成誤解,比方說,如果你只是學習「二進位、十進位、八進位和十六進為的轉換」,通常會覺得很痛苦,心中不斷泛出疑問「我學這幹麼哩?」如果你先搞清楚學習的目的,學起來會比較好理解。

● 如果能「有系統的學習」會更好
除了原因之外,還能先知道這「單一項目在整個學習架構裡的地位」會更好。比方說,學習「數碼系統的轉換」,原來是因為「目前的數位電腦僅處理二進位,但為了理解和紀錄的方便則使用八、十或十六進位」,且「這對寫程式和研究處理器是很重要的」,那學習的動機就會比較強烈。

從處理器運作原理開始研究
所以,且讓本人來立一個學習目標,「研究處理器的簡單運作原理」。

處理器,processor,按理來說是個超級尖端的電腦設備。不過,它的基礎運作原理並不複雜,而且也是電腦的一切原理的開端。根據我的想像,要理解處理器的簡單運作原理,得知道下列事情:

● 整臺電腦的組織架構
了解處理器在整臺電腦中的地位和扮演的角色。

● 處理器本身的簡單結構
處理器裡面通常有許多暫存器,你得知道暫存器的角色和功用。

● 數碼系統的轉換
現在的數位計算機通常僅能處理二進位數字,但我們得熟悉各種數碼系統的轉換才能看懂大部分的火星文字(十六進位程式碼)。

● 數字的縮寫和單位的縮寫
處理器就是用來處理「巨量」資料的,而表示巨量資料通常使用英文字母的縮寫,這些縮寫字常造成學習者的困擾。

● 簡單的數位邏輯
大概只需要知道「AND」、「OR」、「NOT」就差不多了(反正剩下的都可這三個組合而成)。

● 如何無中生有寫出會動的程式
要理解某顆處理器,其中一個途徑就是得用該處理器的「指令」寫出程式來,低階的程式和高階的程式都得會寫。不過,我們的目的不是成為程式設計師,所以不必花太多時間在程式語法的學習,我們只是為了要理解處理器的運作原理。

● 釐清處理器硬體和軟體之間的關聯
雖說「硬體」和「軟體」常被視為兩個單獨的個體,但其實「硬體」本來就是被設計用來執行「軟體」,所以廠商在設計硬體的時候,本來就是不斷的考慮軟體執行的效率,所以你得對這兩個個體的「關聯性」有概括性的認識。

● 了解基本的計算機學理基礎
為何電腦能夠進行各種運算?電腦的侷限是什麼?摩爾定律是什麼?安達爾定律的意義為何?為何電腦進行的是「二進位」而不是「三進位」或是「四進位」演算?什麼是杜林機(或是有限自動機),它們代表的意義為何?這些學理並不複雜,反而簡化複雜的表象。

我還漏了什麼嗎?

沒關係,且讓我們一期一期的慢慢研究,每一周都會有一點進度,慢慢來就可以徹底理解了。

寫個印出數字的小程式
那我們「研究處理器」的第一件事,就是利用Windows內建的一個叫做「DEBUG」的小工具,來寫個「能印出 0123456789」的DOS小程式。

DEBUG這小工具從很久以前,就一直內建在DOS 和各版本的Windows裡面,主要可用來寫迷你的小程式。我們想要一窺處理器的奧秘,用這小工具當作一個「開始」還挺合適的。

從「開始」功能表→程式集→附屬應用程式→命令提示字元,然後在命令提示字元下,輸入DEBUG之後按下Enter。按下 Enter後,畫面會出現一個「減號」的提示字元,這時你就可以在DEBUG模式下寫程式了。

輸入問號(?)可以檢查DEBUG的命令格式。

Alt+Enter可以來回切換於「全螢幕提示字元」和「視窗環境」之間。

接著請依序輸入下列幾行字,這就是「從0印到9」組合語言程式碼。不過第一行的A100不是程式,而是用 DEBUG寫程式的宣告。程式第一行是從「MOV CX, 0A」

A100
MOV CX, 0A
MOV AH, 02
MOV DL, 30
INT 21
INC DL
LOOP 0107
INT 20

注意,最後一行程式是INT 20,輸入完畢之後再按一次Enter就可以結束輸入程式。

要執行程式只需要輸入G然後按下Enter,即可看到印出的文字(0~9)出現在下方。

要儲存程式,則請依據下列步驟(假設程式要取名為PN.COM ,意指「Print Number 」):

RCX
010F
N PN.COM
W

輸入「Q」即可結束DUBUG的執行。

在DOS命令列下,只要輸入PN,程式就會再次印出0~9的數值。從這裡,我們發現:

● 不經說明,DEBUG的操作還真是詭異透頂,又是Q又是A的,不知道在幹麼

● 程式碼也是很奇怪,又是INC又是MOV的,也都不知道在幹嘛

● 程式寫好了存起來,可以反覆使用

● 寫程式表面上並沒有什麼困難就是,短短幾行字卻有神奇的結果出現

DEBUG執行畫面,字均為白色,但為了方便辨別,綠色框內為使用者需要打字輸入的,紅色框內為程式輸出結果。

本期結語:這真是太神奇了
用價值好幾萬的電腦拿來寫這麼無聊的小程式,這當然不是我們的真正目的。而這DEBUG的畫面以及我們輸入的文字,看起來更是透著「邪氣」,看不懂也不知道在做什麼。神奇的是:如果你都輸入正確,它確實可以印出 0123456789,這真是太神奇了。

下期,筆者會從處理器的結構開始說明,幫這幾行程式進行大解密。藉由多寫一點組合語言小程式,我們將會對處理器(主要是Intel x86處理器)獲得更多的認識。

2008年2月19日 星期二

How to Run a Stand Alone Borland C++ Application

Borland C++ Builder (BCB) is a good tool for all range (both object-oriented and/or dynamic) of applications that require a utilization of a graphical user interface (GUI). Traditional C/C++ programs can also be easily integrated with the drag-and-drop tool used for creating a graphical user interface.

Creating an application using BCB is a lot of fun and challenges. However, once the application has been finally created, the next problem is how to run the application (the .exe file) in a stand alone manner, that is, how to run the exe file in a computer without Borland C++ Builder installed.

If the application was ran as stand alone, it will look for some .dll’ s and other files that is required to lunch a BCB created application. Unfortunately, if the computer where the program was ran has no BCB installed, the application will flag an error and terminate.

If you are using a version 6.0 of BCB, you may try the following steps to solve this problem;

1. Go to “Project -> Options”. On “Linker” tab, uncheck the “Use dynamic RTL” checkbox. And, on “Packages” tab, uncheck the “Build with runtime packages”.

2. Compile your project application and save.

3. Using the search tool of windows, search for the following files in the “Borland” folder, where Borland C++ builder was installed:
- borlndmm.dll
- cc3260mt.dll
- stlpmt45.dll
- bcb2kaxserver60.bpl

4. Copy the files that you searched in step 3 to the folder where you want to run the application (the executable file).

This one works well on the 30 day trial edition of Borland C++ Builder 6.0.

2008年2月14日 星期四

interrupt 中斷

中斷顧名思義就是中斷你目前正在執行的工作,轉而執行其他指定的工作。舉一個簡單的例子,假設你現在正在 IE 上瀏覽網頁,如果此時按下一個鍵盤的按鍵,這時候就會產生一個鍵盤的中斷,通知 Windows 現在已經有一個按鍵的動作產生了。



跟中斷相反的另一個動作就是輪詢 (Polling),Polling 是採取主動的方式,在程式的主迴圈或者定時去檢查是否有按鍵,有的話就執行相關的程式,否則就跳回主迴圈繼續執行。這兩者的差別是中斷是被動的,只有在事件發生的時候才會執行動作;而輪詢是主動的,不管有沒有動作發生,都要自行檢查。所以前者所耗費的系統資源較少,也是目前 Windows 作業系統所採用的方式。



至於中斷副程式就是當中斷產生時,所要執行的程式,例如前面所談到的鍵盤中斷,當系統得知有按鍵產生時,必須取得按鍵的 Scan Code,然後根據目前鍵盤的狀態 (如 Caps Lock、Num Lock、Shift、Ctrl、Alt) 等轉換為適當的 ASCII Code or Control Code,然後再將這些 Code 放到 Buffer 裡面,由其他 AP 取得這些按鍵值執行相關的動作。



而中斷向量就是用來記錄那一個中斷要執行那一個中斷副程式的。電腦裡面的中斷可分為硬體中斷與軟體中斷,前者有 Keyboard、Timer、DMA 等等,而後者有 BIOS、DOS Function Call 等等,每一個中斷都有一個中斷向量指向中斷的副程式,就是所謂的中斷向量表。簡單的說就是一個查詢表而己,讓系統查詢甚麼中斷該執行那一個中斷副程式而己

2008年2月12日 星期二

工作程序-Process

什麼是 Process?簡單的說就是在系統中執行的一些程式。

不論是因為系統運行過程所啟動的程式,或是使用者在登入後自行執行的程式、或是常駐執行、或是短暫執行,這些程式在系統中執行時,都會佔用系統的資源(CPU、記憶體等),此時系統就會替程式安排一個程序(Process),以便控管資源的使用!因此,在系統中執行或運作的程式,我們可以稱之為 Process。

誠如上述所言,當程式執行時會產生一個 Process,系統則在此時會配給每個 Process 一個辨識碼,這個辨識碼就是 Process ID 簡稱 PID。而分配的 Process ID 是不會重複的,當程式結束或終止後,PID 就會消失系統也會拋棄不再使用,等到下次重新啟動系統後再從頭計數。

有些程序(Process)在執行時,會呼叫或啟用其它的程序,這些被呼叫的程序可稱為子程序,而最先被執行的程序就被當成父程序(Parent Process)。子程序也有一個 PID,同時也會註記父程序的 PID,稱之為 PPID。整個系統最初的父程序是 init 這支程式,不論程序呼叫了幾層的子程序,往前推算最終還是到了 init 這個程式所產生的程序,而 init 程序的 PID 為 0。

2008年2月5日 星期二

What is the Swap File?

What is the Swap File?

To execute a program in Windows, it first needs to be loaded into memory (RAM). Windows lets you run multiple programs simultaneously and chances are that they won't all fit into memory at the same time. For that purpose, Windows uses what is called Virtual Memory to simulate RAM, pretending it has more memory than what is actually build into the PC. It does this by moving data from real memory to a special file on the hard drive, called the swap file in Windows 95/98 or page file in Windows NT. This, in effect, allows Windows to address more memory than the amount of physical RAM installed. Without it, we would not be able to run windows on machines with limited RAM. For example, think back to when Windows 95 first came out, the average computer had 8 to 16 Mb of Ram. It would not have been possible to run Win95 and applications without using virtual memory. Program code and data are moved in pages (memory allocated in 4K or 16K segments within a 64K page frame) from physical memory to the swap file. As the information is needed by a process, it is paged back into physical memory on demand and, if necessary, windows may page other code or data to the swap file in its place.

The Windows Managed Swap File Grows and Shrinks

By default, windows manages the swap file dynamically, meaning that Windows increases and decreases its size as needed. For most users it is recommended to let Windows manage it to ensure that there is always sufficient memory addressing for applications and processes. The advantage of a dynamic swap file is that it does not permanently make hard disk space unavailable, it can only grow if there is sufficient disk space. When you shut down, the swap file is being deleted. It is re-created again when Windows is started. The disadvantage of a Windows managed swap file is that it becomes fragmented, and performance can be lost due to frequent resizing as your computer is performing memory intensive tasks. Fortunately, educated users of Windows can specify their own virtual memory settings if they deem it necessary.

Specify Your Own Virtual Memory Settings

You access these settings from within the System Control Panel applet. The easiest way to get to that from the Desktop is to right-click on the My Computer icon and choose Properties from the menu. Another way is to click Start/Settings/Control Panel/System. Click the Performance tab and click the Virtual Memory button.

If you see this for the first time, the option Let Windows Manage my virtual memory is probably selected and the other fields are grayed out. Click the Let me specify my own... and choose the drive you want to put your swap file on by clicking the drop list in the Hard Disk field and state the minimum and maximum swap file size in the appropriate fields.

2008年1月30日 星期三

stack、heap、swap

在C++裡, int p[labl][labw], 這種陣列是屬於在動態陣列和靜態陣列之間的一種陣列. 原因是此陣列讓你在執行時宣告其大小(靜態陣列要在寫時宣告其大小)但宣告其大小過後卻不能改變其大小(動態陣列可改). 在電腦裡有兩種記憶體, 一是stack, 另一種是heap. stack是所有變數所在的地方. heap是所有new和malloc()回傳的記憶體所在的地方. 一般來講, 靜態陣列是存在於stack而動態陣列是存在於heap. 而這種陣列的記憶體是存在於stack. 當你把labl和labw設為1000時, p的大小是1000*1000*sizeof(int) = 1000*1000*4 = 4,000,000. 所以當在執行這程式時當執行到int p[labl][labw], 電腦要從stack中拿出4,000,000個記憶體時因stack裡沒這麼多記憶體, 所以出錯. 如果你改成用動態陣列則無此問題. 因動態陣列是用heap而不是stack. heap比stack大. 不過雖然heap比stack大, 但仍有其限制.

在kernel space不可能超過heap的極限的. 因在將近heap的極限時會thrashing(電腦會變的很慢). 不過在user space(你在user space), 也很難超過. 對初學者來說根本不可能. 因為heap的極限跟你的paging space和physical memory有關. 若將近heap的極限時也會thrashing(電腦會變的很慢).

在 Linux 上的 『Swap 空間』是在當實體記憶體(RAM)用完時才會使用到,假如系統需要更多的記憶體資源,而實體記憶體已經用完,記憶體上不活動的頁面將會被移到 swap 空間。 雖然 swap 空間可以幫助系統增加一小部份容量的 RAM,不過不能將它當作更多記憶體的替代品。 Swap 空間是位於硬碟上,它的存取速度比起實體記憶體慢了很多。

2008年1月16日 星期三

找工作@@|||  

從1月初開始找工作到現在,也面試了幾家
有個CIM工程師月薪32000,勞退6%另外加
出差還有補助,感覺不錯,不過就是要常出差
可能還要去大陸、南部,有時就是1個月,所以嘍!
就給他放棄,接著又去5吉不動產,算是個網頁設計
及管理的工作內容,可能還要做一些美工之類的
不過就是一開始才20000元,如果有寫出程式或貢獻後
就會調薪,也是在竹北……,最近就是一個程式設計師
一個月28K左右,不過全公司就一個軟體工程師
其他的有硬體……算小公司,之前的人也要閃了!
主要是顧客會一直問一堆和本身寫的系統沒啥相關
所以有點受不鳥,就不幹了!唉…
每個都不是很完美的工作,真不知道該怎麼選
如果到過年又還找不到工作那不就很……唉…:(
可能就是先去做交通工程的這個吧!
下午還要去一次和董事長見面一下!所以嘍!
再看看嘍!