Saturday, July 31, 2010

組合語言非常不適合被當作單獨的電腦程式語言來學習

Albert.B
我記得我以前好像講過,不過我還是再強調一次...

"組合語言非常不適合被當作單獨的電腦程式語言來學習!!!"

所謂的"組合語言"是可以跟某一種CPU的二進位指令碼一對一
對應的速記符號,當你在講"組合語言"時,實際上是指某一種
CPU的指令集的速記碼,而且你指的還是"某一種組譯器"所能
接受的格式.

為什麼組合語言不適合這樣教? 因為要一個初學者了解組合
語言,他必須先了解這顆CPU,要了解一顆CPU,他至少要知道
大致上CPU是怎麼回事,所以,他必須先學完計算機結構,至少,
要學完"指令集",然後再以某個特定CPU的指令集為例子,教他
這種CPU的組合語言.

學會了C,你到哪用的C都大同小異,但是在不明白計算機結構
的情況下學x86組合語言,你可能不會了解MIPS或Alpha的組語
要怎麼寫,不要說是別種CPU,你看了施威銘那本組合語言,我
就不相信你知道同樣在x86底下,UNIX裡面要顯示字元怎麼寫,
你也不會知道在不准靠INT 21(DOS),INT19(BIOS),的情況下
要怎麼去用組合語言存取硬體,偏偏這些才是組合語言的真正
目的.

這世界上沒有哪本書可以讓初學者不碰計算機結構,就可以
學好組合語言的,要基礎,要觀念清楚,請先找一本清楚的計
算機結構課本,沒有這種基礎,施威銘那本(以及坊間絕大部
分的組合語言"入門"書)只會讓你知道怎麼呼叫DOS和BIOS
裡面別人已經幫你寫好的東西,至於那些東西怎麼寫,你大概
也學不會.

--
廟小妖風大
池淺王八多
--

> : 對於這個部份我深有同感,
> : 市面上x86的書好像都是在講解
> : DOS下的組合語言使用法,
> : 對於一些我比較想要了解的
> : 部份都未提及..
> 我以前也看到有人 post 說,如果寫組語都只是在 call 別人寫好的程式(int),
> 那這樣根本不算是真正在寫組語。這樣的說法嚴格了一點,不過市面上的組語書
> 的確大都以「你要學 DOS下 x86 組合語言」為前提。我也很想知道如果不用DOS
> 和 BIOS 的中斷,要怎麼寫個程式達到有那些中斷的功能或者存取硬體,不知道
> 有什麼書是以這樣的主題為內容呢?想來真的是蠻不容易的。

那就是我說的....

有沒有書會拿這種主題當內容? 很抱歉,沒有.

為什麼沒有? 因為講不完,"存取硬體"意味著你
要知道這個硬體的介面(也就是溝通的規則),這
世界上有多少種介面? 有多少種規則? 你自己
隨時可以創出一個硬體介面來,怎麼可能有哪本
書告訴你所有的規則?

舉個例子來說,IDE硬碟知道吧? 知道怎麼存取嗎?
這個問題要問你的IDE硬碟控制器,如果很幸運的,
這個控制器是傳統的定址方式,你可以知道IRQ是14,
I/O port是1F0h-1F7h(我沒記得很確實),然後你
就要找出ST506/412當年的介面規定,上面會告訴你
1F0是資料暫存器,1F1是指令等等等等,然後你就
用in/out對暫存器讀寫適當的值.

如果不是,你就要看該控制器的介面手冊,然後自己
去想辦法摸出方法來存取.

很麻煩是不是? 但是它們的骨子裡是一樣的,也就
是說,你透過CPU對外界的存取(記憶體或是I/O port)
來對一個硬體裝置下達它能接受的命令,正如同你
學習以x86能接受的方式去對CPU下命令一樣,而這個
裝置所能接受的命令,就是它的指令集.

所以你可以了解為什麼我極力鼓吹學習組合語言的
應該先學計算機結構,因為你要先有這種基本的概念,
才能在學習組語的過程中知道自己在學的是什麼,
知道如果遇上問題,你應該去找什麼樣的資料.

也唯有了解計算機結構,你才能了解為什麼我們通常
用 xor ax,ax,而不用mov ax,0,雖然這兩個作用一樣.

Reference:
請介紹一本適合初學者關於組合語言的書

No comments: