單片機彙編指令

單片機彙編指令

單片機彙編指令:為解決某些特定的問題代碼中必須嵌入彙編語言以代替C語言完成的單片機的編程,彙編語言對於程式調試是不可或缺的。它包括:算術操作類指令,布爾變數操作類指令,邏輯運算元指令,控制轉移類指令。

基本介紹

簡介,組成,指令系統,彙編指令,

簡介

現在單片機的編程大多 是C語言完成
但有時代碼中必須嵌入彙編語言解決某些特定的問題
對於程式調試 彙編語言更是不可或缺。
直接使用彙編指令編寫單片機程式,對硬體的控制更加直接,可以直接操作物理地址暫存器,連線埠等;其它更高級的語言(如:C語言)對硬體的控制是依賴於類庫來實現的。並且,對於一些對程式大小和運行速度有非常嚴苛要求的項目而言,都必須使用彙編指令。C語言只是為了方便編寫,與機器打交道的其實都是2進制得代碼,彙編語言就是這些代碼好記憶的名稱和規則,只是比C語言難理解些。

組成

單片機要自動完成計算,它應該具有哪些最重要的部分呢?
我們以打算盤為例計算一道算術題。例:36+163×156-166÷34。現在要進行運算,首先需要一把算盤,其次是紙和筆。我們把要計算的問題記錄下來,然後第一步先算163×156,把它與36相加的結果記在紙上,然後計算166÷34,再把它從上一次結果中減去,就得到最後的結果。
現在,我們用單片機來完成上述過程,顯然,它首先要有代替算盤進行運算的部件,這就是“運算器”;其次,要有能起到紙和筆作用的器件,即能記憶原始題目、原始數據和中間結果,還要記住使單片機能自動進行運算而編制的各種命令。這類器件就稱為“存貯器”。此外,還需要有能代替人作用的控制器,它能根據事先給定的命令發出各種控制信號,使整個計算過程能一步步地進行。但是光有這三部分還不夠,原始的數據與命令要輸入,計算的結果要輸出,都需要按先後順序進行,有時還需等待。
如上例中,當在計算163×156時,數字36就不能同時進入運算器。因此就需要在單片機上設定按控制器的命令進行動作的“門”,當運算器需要時,就讓新數據進入。或者,當運算器得到最後結果時,再將此結果輸出,而中間結果不能隨便“溜出”單片機。這種對輸入、輸出數據進行一定管理的“門”電路在單片機中稱為“口”(Port)。在單片機中,基本上有三類信息在流動,一類是數據,即各種原始數據(如上例中的36、163等)、中間結果(如166÷34所得的商4、餘數30等)、程式(命令的集合)等。這樣要由外部設備通過“口”進入單片機,再存放在存貯器中,在運算處理過程中,數據從存貯器讀入運算器進行運算,運算的中間結果要存入存貯器中,或最後由運算器經“出入口”輸出。
用戶要單片機執行的各種命令(程式)也以數據的形式由存貯器送入控制器,由控制器解讀(解碼)後變為各種控制信號,以便執行如加、減、乘、除等功能的各種命令。所以,這一類信息就稱為控制命令,即由控制器去控制運算器一步步地進行運算和處理,又控制存貯器的讀(取出數據)和寫(存入數據)等。第三類信息是地址信息,其作用是告訴運算器和控制器在何處去取命令取數據,將結果存放到什麼地方,通過哪個口輸入和輸出信息等。
存貯器又分為唯讀存貯器和讀寫存貯器兩種,前者存放調試好的固定程式和常數,後者存放一些隨時有可能變動的數據。顧名思義,唯讀存貯器一旦將數據存入,就只能讀出,不能更改(EPROM、E2PROM等類型的ROM可通過一定的方法來更改、寫入數據——編者注)。而讀寫存貯器可隨時存入或讀出數據。
實際上,人們往往把運算器和控制器合併稱為中央處理單元——CPU。單片機除了進行運算外,還要完成控制功能。所以離不開計數和定時。因此,在單片機中就設定有定時器兼計數器,其基本結構與本連載之(二)中的舉例類似。到這裡為止,我們已經知道了單片機的基本組成,即單片機是由中央處理器(即CPU中的運算器和控制器)、唯讀存貯器(通常表示為ROM)、讀寫存貯器(又稱隨機存貯器通常表示為RAM)、輸入/輸出口(又分為並行口串列口,表示為I/O口)等等組成。實際上單片機裡面還有一個時鐘電路,使單片機在進行運算和控制時,都能有節奏地進行。另外,還有所謂的“中斷系統”,這個系統有“傳達室”的作用,當單片機控制對象的參數到達某個需要加以干預的狀態時,就可經此“傳達室”通報給CPU,使CPU根據外部事態的輕重緩急來採取適當的應付措施。
現在,我們已經知道了單片機的組成,餘下的問題是如何將它們的各部分連線成相互關聯的整體呢?實際上,單片機內部有一條將它們連線起來的“紐帶”,即所謂的“內部匯流排”。此匯流排有如大城市的“幹道”,而CPU、ROM、RAM、I/O口、中斷系統等就分布在此“匯流排”的兩旁,並和它連通。從而,一切指令、數據都可經內部匯流排傳送,有如大城市內各種物品的傳送都經過幹道進行。

指令系統

前面已經講述了單片機的幾個主要組成部分,這些部分構成了單片機的硬體。所謂硬體(Hardware),就是看得到,摸得到的實體。但是,光有這樣的硬體,還只是有了實現計算和控制功能的可能性。單片機要真正地能進行計算和控制,還必須有軟體(Software)的配合。軟體主要指的是各種程式。只有將各種正確的程式“灌入”(存入)單片機,它才能有效地工作。單片機所以能自動地進行運算和控制,正是由於人把實現計算和控制的步驟一步步地用命令的形式,即一條條指令(Instruction)預先存入到存貯器中,單片機在CPU的控制下,將指令一條條地取出來,並加以翻譯和執行。就以兩個數相加這一簡單的運算來說,當需要運算的數已存入存貯器後,還需要進行以下幾步:
第一步:把第一個數從它的存貯單元(Location)中取出來,送至運算器
第二步:把第二個數從它所在的存貯單元中取出來,送至運算器; 第三步:相加; 第四步:把相加完的結果,送至存貯器中指定的單元。
所有這些取數、送數、相加、存數等等都是一種操作(Operation),我們把要求計算機執行的各種操作用命令的形式寫下來,這就是指令。但是怎樣才能辨別和執行這些操作呢?這是在設計單片機時由設計人員賦予它的指令系統所決定的。一條指令,對應著一種基本操作;單片機所能執行的全部指令,就是該單片機的指令系統(Iustruction Set),不同種類的單片機,其指令系統亦不同。
使用單片機時,事先應當把要解決的問題編成一系列指令。這些指令必須是選定的單片機能識別和執行的指令。單片機用戶為解決自己的問題所編的指令程式,稱為源程式(Source Program)。指令通常分為操作碼(Opcode)和運算元(Operand)兩大部分。操作碼錶示計算機執行什麼操作,即指令的功能;運算元表示參加操作的數或運算元所在的地址(即運算元所存放的地方編號)。因為單片機是一種可程式器件,只“認得”二進碼(0、1)。要單片機運作,單片機系統中的所有指令,都必須以二進制編碼的形式來表示。例如,在Intel公司的MCS-51系列單片機中,從存貯器中取出一數到CPU中的累加器(在運算器中,參與運算、存放運算結果的專用暫存器)的指令代碼為74H,累加器內容加立即數的代碼為24H,再加上立即數代碼,累加器送數到內部RAM存貯器的代碼為F6H~F7H等。這些指令是用十六進制表示二進制的機器碼
MCS-51單片機的字長為8位,有時,要完成某些操作用一個位元組尚不能充分表達。所以,在指令系統中有單位元組指令,也有多位元組指令。機器碼是由一連串的0和1組成,沒有明顯的特徵,不好記憶,不易理解,易出錯。所以,直接用它來編寫程式十分困難。因而,人們就用一些助記符(Mue monic)——通常是指令功能的英文縮寫來代替操作碼,如MCS-51中數的傳送常用MOV(Move的縮寫)、加法用Add(Addition的縮寫)來作為助記符。這樣,每條指令有明顯的動作特徵,易於記憶和理解,也不容易出錯。用助記符來編寫的程式稱為彙編語言程式。但是,助記符編寫的程式便於人理解,可單片機卻只認識二進制機器代碼,因此,為了讓單片機能“讀懂”彙編語言程式必須再轉換成由二進制機器碼構成的程式,這種轉換過程,就稱為“彙編”。彙編可藉助於人工查表法來實現,也可藉助PC機通過所謂“交叉彙編程式”來完成。由機器碼構成的用戶程式一旦“進入”了單片機,再“啟動”單片機,就可讓它執行輸入程式所規定的任務。

彙編指令

常用單片機彙編指令:
1 .MOV A,Rn 暫存器內容送入累加器
2 .MOV A,direct 直接地址單元中的數據送入累加器
3 .MOV A,@Ri (i=0,1)間接RAM 中的數據送入累加器
4 .MOV A,#data 立即數送入累加器
5 .MOV Rn,A 累加器內容送入暫存器
6 .MOV Rn,direct 直接地址單元中的數據送入暫存器
7 .MOV Rn,#data 立即數送入暫存器
8 .MOV direct,A 累加器內容送入直接地址單元
9 .MOV direct,Rn 暫存器內容送入直接地址單元
10. MOV direct,direct 直接地址單元中的數據送入另一個直接地址單元
11 .MOV direct,@Ri (i=0,1)間接RAM 中的數據送入直接地址單元
12 MOV direct,#data 立即數送入直接地址單元
13 .MOV @Ri,A (i=0,1)累加器內容送間接RAM 單元
14 .MOV @Ri,direct (i=0,1)直接地址單元數據送入間接RAM 單元
15 .MOV @Ri,#data (i=0,1)立即數送入間接RAM 單元
16 .MOV DPTR,#data16 16 位立即數送入地址暫存器
17 .MOVC A,@A+DPTR 以DPTR為基地址變址定址單元中的數據送入累加器
18 .MOVC A,@A+PC 以PC 為基地址變址定址單元中的數據送入累加器
19 .MOVX A,@Ri (i=0,1)外部RAM(8 位地址)送入累加器
20 .MOVX A,@DPTR 外部RAM(16 位地址)送入累加器
21 .MOVX @Ri,A (i=0,1)累計器送外部RAM(8 位地址)
22 .MOVX @DPTR,A 累計器送外部RAM(16 位地址)
23 .PUSH direct 直接地址單元中的數據壓入堆疊
24 .POP direct 彈棧送直接地址單元
25 .XCH A,Rn 暫存器累加器交換
26 .XCH A,direct 直接地址單元與累加器交換
27 .XCH A,@Ri (i=0,1)間接RAM 與累加器交換
28 .XCHD A,@Ri (i=0,1)間接RAM 的低半位元組與累加器交換
算術操作類指令:
1. ADD A,Rn 暫存器內容加到累加器
2 .ADD A,direct 直接地址單元的內容加到累加器
3 A.DD A,@Ri (i=0,1)間接ROM 的內容加到累加器
4 .ADD A,#data 立即數加到累加器
5 .ADDC A,Rn 暫存器內容帶進位加到累加器
6 .ADDC A,direct 直接地址單元的內容帶進位加到累加器
7 .ADDC A,@Ri(i=0,1) 間接ROM 的內容帶進位加到累加器
8 .ADDC A,#data 立即數帶進位加到累加器
9 .SUBB A,Rn 累加器帶借位減暫存器內容
10. SUBB A,direct 累加器帶借位減直接地址單元的內容
11 .SUBB A,@Ri (i=0,1)累加器帶借位減間接RAM 中的內容
12 .SUBB A,#data 累加器帶借位減立即數
13 .INC A 累加器加1
14 .INC Rn 暫存器加1
15 .INC direct 直接地址單元加1
16 .INC @Ri (i=0,1)間接RAM 單元加1
17 .DEC A 累加器減1
18 .DEC Rn 暫存器減1
19 .DEC direct 直接地址單元減1
20 .DEC @Rj 間接RAM 單元減 1
21 .INC DPTR 地址暫存器DPTR 加 1
22 .MUL AB A 乘以B,結果放在A
23 .DIV AB A 除以B,結果放在A
24. DA A 累加器十進制調整
布爾變數操作類指令:
1. CLR C 清進位位
2 .CLR bit 清直接地址位
3 .SETB C 置進位位
4 .SETB bit 置直接地址位
5 .CPL C 進位位求反
6 .CPL bit 置直接地址位求反
7 .ANL C,bit 進位位和直接地址位相“與”
8 .ANL C,/bit 進位位和直接地址位的反碼相“與”
9 .ORL C,bit 進位位和直接地址位相“或”
10. ORL C,/bit 進位位和直接地址位的反碼相“或”
11 .MOV C,bit 直接地址位送入進位位
12 .MOV bit,C 進位位送入直接地址位
13 .JC rel 進位位為1 則轉移
14 .JNC rel 進位位為0 則轉移
15 .JB bit,rel 直接地址位為1 則轉移
16 .JNB bit,rel 直接地址位為0 則轉移
17 .JBC bit,rel 直接地址位為1 則轉移,該位清零
邏輯運算元指令:
1. ANL A,Rn 累加器暫存器相“與”
2 .ANL A,direct 累加器與直接地址單元相“與”
3 .ANL A,@Ri 累加器與間接RAM 單元相“與”
4 .ANL A,#data 累加器與立即數相“與”
5 .ANL direct,A 直接地址單元與累加器相“與”
6 .ANL direct,#data 直接地址單元與立即數相“與”
7 .ORL A,Rn 累加器與暫存器相“或”
8 .ORL A,direct 累加器與直接地址單元相“或”
9 .ORL A,@Ri 累加器與間接RAM 單元單元相“或”
10. ORL A,#data 累加器與立即數相“或”
11. ORL direct,A 直接地址單元與累加器相“或”
12 .ORL direct,#data 直接地址單元與立即數相“或”
13 .XRL A,Rn 累加器與暫存器相“異或”
14 .XRL A,direct 累加器與直接地址單元相“異或”
15 .XRL A,@Ri 累加器與間接RAM 單元單元相“異或”
16 .XRL A,#data 累加器與立即數相“異或”
17 .XRL direct,A 直接地址單元與累加器相“異或”
18 .XRL direct,#data 直接地址單元與立即數相“異或”
19 .CLR A 累加器清“0”
20 .CPL A 累加器求反
21 .RL A 累加器循環左移
22 .RLC A 累加器帶進位位循環左移
23 .RR A 累加器循環右移
24 .RRC A 累加器帶進位位循環右移
25 .SWAP A 累加器半位元組交換
控制轉移類指令
1. ACALL addr11 絕對(短)調用子程式
2 .LCALL addr16 長調用子程式
3 .RET 子程式返回
4 .RETI 中斷返回
5 .AJMP addr11 絕對(短)轉移
6 .LJMP addr16 長轉移
7 .SJMP rel 相對轉移
8 .JMP @A+DPTR 相對於DPTR 的間接轉移
9. JZ rel 累加器為零轉移
10. JNZ rel 累加器非零轉移
11. CJNE A,direct,rel 累加器與直接地址單元比較,不相等則轉移
12 .CJNE A,#data,rel 累加器與立即數比較,不相等則轉移
13 .CJNE Rn,#data,rel 暫存器與立即數比較,不相等則轉移
14 .CJNE @Ri,#data,rel 間接RAM 單元與立即數比較,不相等則轉移
15 .DJNZ Rn,rel 暫存器減1,非零轉移
16 .DJNZ direct,rel 直接地址單元減1,非零轉移
17 .NOP 空操作

相關詞條

熱門詞條

聯絡我們