1. 程式人生 > >Computer Language

Computer Language

CPU Heap Stack

匯編語言

計算機是人類創造出來的一種高級工具,有著簡單的智能,但是還並不能向人與人一樣直接交流;而人們通常控制計算機的程序也都是高級語言編寫,計算機不能直接識別高級語言,必須通過編譯器轉成二進制代碼才能識別運行。
計算機真正能夠理解的都是低級語言,來控制硬件設備。而匯編語言就是低級語言,直接描述控制CPU的運行。
因此,在了解計算機語言之前,先弄明白匯編語言是怎麽回事;一定會事半功倍!
1: What is assembly language?
在計算機裏最核心的就是CPU,CPU雖然負責計算,卻本身不具備智能。你給它一個指令它就運行一次,運行完就等待下一個指令。而這些指令都是二進制的,我們都稱之為操作碼 (opcode);如: 00000000

00000001
00000010
這三行數字就是二進制的指令分別代表為數字:0,1,2
對於人類來說,這樣的代碼程序是不能識別的,也就不知道機器到底在幹啥了。而計算機可以通過編譯器把人類能識別的高級語言編寫的程序,翻譯成二進制指令解讀給自己。因此,人們為了解決對二進制程序的識別問題,以及簡單的編輯需求,就誕生了匯編語言 。
(匯編語言是二進制指令的文本形式,與指令是對應的關系。只要還原成二進制,匯編語言就可以被CPU直接執行,所以匯編語言就是最基礎的低級語言。)
2:The origin of assembly language
在早期,編寫程序就是手工寫二進制指令,然後通過各種開關輸入計算機,比如要做加法了,就按一下加法開關。後來,發明了紙帶打孔機,通過在紙帶上打孔,將二進制指令自動輸入計算機。
而為了解決對二進制指令的解讀識別問題, 工程師將那些指令寫成了八進制。二進制轉成八進制是簡單的很,但是八進制與二進制都差不多,可讀性並沒有提高。到最後,還是用文字表達。內存地址也不再直接引用,而是 用標簽表示。
如此,就變得復雜了點。多了一個步驟,要把這些指令翻譯成二進制,就稱之為assembling,完成這個步驟的程序就叫做assembler。它處理的文本,就叫做assembly code。標準化以後,稱之為assembly language,縮寫為asm,中文就叫匯編語言。
(每一種CPU的機器指令都是不一樣的,因此對應的匯編語言也是不一樣的,而接下來要說的是目前最流行的X86 匯編語言,也就是因特爾的CPU。)
3:Register and memory model.
寄存器和內存模型是認識匯編語言必須了解的兩大知識點。

首先說說寄存器。
說到寄存器就得先說一下CPU了,計算機的核心硬件CPU是有兩大部分組成:運算器和控制器;因此CPU本身只負責運算,不負責存儲數據。數據一般都是儲存在內存中,CPU要是運作是就去內存裏調用數據。而CPU的運算速度要遠遠高於內存的讀寫速度的;因此,為了避免內存速度拖累CPU,就在CPU上設置了緩存,分為一級和二級。而緩存也是一種內存,要快過普通內存的讀寫速度。
但是,隨著CPU的進步,緩存還是不夠快,另外數據在緩存裏面的地址是不固定的,CPU每次讀寫都要尋址也會拖慢速度。為此,在CPU裏就又有了寄存器的出現,用來儲存最常用的數據。也就是說,那些最頻繁讀寫的數據(比如循環變量),都會放在寄存器裏面,CPU會優先讀取寄存器,再由寄存器跟內存交換數據。
(寄存器不依靠地區分區數據,而是依靠名稱。每一個寄存器都有自己的名稱,我們告訴CPU去具體的哪一個寄存器拿數據,這樣的速度是最快的。很多人都稱之為CPU的零級緩存。)

Computer Language