複製鏈接
請複製以下鏈接發送給好友

單片機彙編指令

鎖定
單片機彙編指令:為解決某些特定的問題代碼中必須嵌入彙編語言以代替C語言完成的單片機的編程,彙編語言對於程序調試是不可或缺的。它包括:算術操作類指令,布爾變量操作類指令,邏輯操作數指令,控制轉移類指令。
中文名
單片機彙編指令
外文名
Assembler directive
使用語言
C語言彙編語言
解決目標
特定的問題代碼
應用領域
程序調試
指令數目
4

單片機彙編指令簡介

現在單片機的編程大多 是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(彙編語言程序)。但是,助記符編寫的程序便於人理解,可單片機卻只認識二進制機器代碼,因此,為了讓單片機能“讀懂”彙編語言程序必須再轉換成由二進制機器碼構成的程序,這種轉換過程,就稱為“彙編”。彙編可藉助於人工查表法來實現,也可藉助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 .ADD 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 空操作