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.

2009年2月24日 星期二

ORACLE - imp

imp UserName/Password@ServerName

如果直接imp會有錯誤訊息

2009年2月22日 星期日

ORACLE-CREATE TABLE...

複製一個已存在的table到另一個新的table

copy an existing table
sql> create table table_name [logging|nologging] as subquery


ex:
CREATE TABLE PHASE92 AS SELECT * FROM PHASE
建一個新的talbe叫『phase92』裡面的內容來自於table『phase』

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的用法嗎?很抱歉,我想,得等到適當的時間再介紹了!幸好,我們有得是時間呢!