1.匯編語言的產生
我們都知道,計算機能夠處理的語言只有機器語言,也就是只用0和1兩個二進制數書寫的編程語言。也就是說,早期的程序員如果想要編程,就要將0,1數字編寫的程序代碼打在紙帶或者卡片上,1打孔,0不打孔,再將程序通過制袋機或者卡片機輸入計算機,進行運算。我們可想而知,當時的程序員是多么厲害。但是他們很快發現編寫的都是0,1很難辨別和記憶,因為程序員要面對的是01010100011...的數字,稍微錯一個數字也不太好發現,因此,就產生了匯編語言。
着便是匯編語言的產生。
2.匯編語言的基礎知識
首先,我們先了解一些基本概念:
- 機器語言
所謂機器語言,就是只用0和1兩個二進制數書寫的編程語言。它有的時候也叫作原生代碼(Native Code)。這里需要注意,只要CPU種類不同,對機器語言的解釋也就不同。 - 編譯器
由於計算機只能讀懂機器指令,所以就需要一個能夠將匯編指令轉換成機器指令的翻譯程序,這樣的程序我們稱其為編譯器。程序員用匯編語言寫出源程序,再用匯編編譯器將其翻譯為機器碼。就像我們寫的Java,OC,等等,都是由編譯器最終轉換成01代碼,最后由計算機執行。 - 時鍾信號的頻率
由時鍾發生器發送給CPU的電信號的頻率。單位是MHZ(兆赫茲 = 100萬回/秒)。時鍾信號是0和1兩個數之間反復變換的電信號,類似於滴答滴答左右擺動的鍾擺一樣。通常我們把發出一次滴答的時間稱作一個時鍾周期。
簡單先了解這么幾個概念,接下來讓我們正式走進匯編語言。先來看看下面一段代碼:
LD A,207
OUT(2),A
LD A,255
OUT(2),A
這樣的一段代碼,初次見到我們肯定不太理解其意思。它就是匯編語言。我們現在在簡單分析一下這段代碼(不解釋功能):
類似於LD、OUT這種類英語或者英語單詞的東西,我們叫它:
助記符
它是根據指令功能的單詞起一個相似的昵稱,並將這個昵稱做一個1對1的映射,而與其對應的就是0和1的組合。
那什么叫匯編語言呢?顧名思義,就是使用助記符的編程語言叫做“匯編語言“。
匯編語言的語法
匯編語言的語法很簡單,相比我們學的OC、Java等語言,它的語法只有一個:把標簽、操作碼(指令)和操作數(指令的對象)並排寫在一行。
舉個簡單的例子:
標簽 操作碼 操作數
LD A,207
OUT (2),A
LOOP: IN A,(0)
OUT (1),A
JP LOOP
這便是一個匯編代碼(沒有實際意義)。這里的標簽就是給該行代碼對應的內存地址起個名字,下次想要跳轉到該行代碼的時候可以直接使用標簽跳轉。這里需要注意:
機器語言是二進制數,而匯編語言則是使用十進制或者十六進制數來記錄數據。
接下來,就讓我們看一下Z80 CPU的主要指令:
這里需要注意一下:
num表示的是數值,(num)表示的是num的地址
reg表示的是寄存器,(reg)表示存儲在名為reg的寄存器中的地址。
這里說道了寄存器,其實寄存器就是CPU內部存儲數據的地方。Z80 CPU中所帶的寄存器有:
A、B、C、D、E、F、H、L、IR、 IX、 IY、 SP、 PC。
在匯編語言中,可以將寄存器的名字指定為操作數
接下來讓我們簡單分析前面的那一段代碼。
LD A,207:就是把207寫入到寄存器A
OUT (2),A:就是把寄存器A中的值寫入到地址2中
IN A,(0):從地址0中讀出數據,存放到寄存器A中
OUT (1),A:把寄存器A中的值寫入到地址1中
JP LOOP:跳轉到LOOP:標簽,循環執行。
剛才也說了,計算機只能認識機器語言,所以我們剛才寫的匯編語言還需要轉換為機器語言才能運行。接下來讓我們先看一個表格:
也就是說,我們按照上面的轉換方法就可以將匯編語言轉成機器語言。例如
LD A ,207 ,轉成機器語言就是00111110 11001111
JP LOOP,轉成機器語言就是: 11000011 num,這里的num是地址,這里注意需要用16比特的二進制數替代作為內存地址的num,也就是00000000 00010000 (也就是00010000假如是IN A,(0)的地址,擴充之后就是00000000 00010000),因此JP LOOP的機器語言就是:
11000011 00010000 00000000。
這里你也許會疑惑,num的八個0怎么跑后面了呢?
這里需要注意,將一個2字節的數據存儲到內存時,存儲順序是低八位在前、高8位在后,也叫小端序。與此相反的叫大端序。CPU種類不同,端序也不同,Z80用的小端序,因此將低八位放到了前面,高八位的00000000放到了后面,就成了:11000011 00010000 00000000。
至此,我們就成功的將匯編語言轉換成了機器語言,其他的助記符到機器語言的轉換可以自行搜索查看。