目錄
基本概念講解
一、機器指令?
二、匯編指令?
(一)匯編指令的一般格式
(二)按字節數分類的指令
三、高級指令
總結?
基本概念講解
????????指令是計算機(或單片機)中 CPU 能夠識別并執行的基本操作命令。
????????指令系統是一臺計算機(或單片機)能夠執行的全部指令的集合。指令系統的強弱,決定了計算機智能的高低。
????????對于 51 單片機而言,其指令系統涵蓋了數據傳送、算術運算、邏輯操作、控制轉移、位操作等多種類型的指令。這些指令有機組合,賦予了 51 單片機強大的功能。
????????要使計算機(或單片機)按照人們的要求完成一項工作,就必須讓CPU按照一定邏輯順序逐條執行人們編寫的指令。這種按照人們要求所編排的指令操作的序列,稱為程序。編寫程序的過程叫程序設計。
????????程序設計語言就是編寫程序的一整套規則和方法,是實現人機交換信息的基本工具。分為機器語言、匯編語言和高級語言。
? ? ? ? 為了方便稱呼,我們可以將其對應的指令分別稱為:機器指令、匯編指令、高級指令(如使用 C51 寫出的指令)。
????????雖然說并沒有高級指令這個概念,但是這樣去理解是不存在問題的。而且無論是匯編語言還是高級語言寫出的程序,最終都要先被翻譯成機器可以識別的機器指令,才能在計算機(或單片機)上執行。
????????本文將會對51單片機中的這三種指令作簡單介紹。
一、機器指令?
????????機器指令是 51 單片機能夠直接識別并執行的二進制代碼。它以 0 和 1 的序列形式存在,每一條機器指令都對應著特定的硬件操作。
????????例如,實現數據傳送的機器指令,會通過控制單片機內部的數據總線,將數據從一個存儲單元搬運到另一個存儲單元。
????????雖然機器指令直接面向硬件,執行效率高,但由于其采用二進制形式,對于開發者而言,閱讀和編寫難度極大。在實際開發中,很少直接使用機器指令進行編程,而是借助匯編語言或高級語言,通過編譯器將代碼轉換為機器指令。?
二、匯編指令?
????????匯編指令是機器指令的助記符形式,與機器指令一一對應。
????????相較于機器指令,匯編指令使用具有一定含義的英文單詞或縮寫來表示操作碼和操作數,大大提高了程序的可讀性和可編寫性。
????????51 單片機匯編語言指令的一般格式如下:[標號:] 操作碼 [操作數]?[;注釋]。一般格式中,方括號表示可以沒有相應的部分,即可以沒有標號、操作數、注釋,但一定要有操作碼。
? ? ? ? 例如?“NOP” 指令,屬于空操作指令,它不需要操作數,僅僅執行一個空操作周期,用于產生短暫延時等場景。
? ? ? ? 匯編指令要被翻譯成機器指令(二進制代碼)才能被機器識別并執行對應功能,操作碼和操作數都有對應的二進制編碼,指令代碼有若干個字節組成。在51單片機的指令系統中,有單字節指令、雙字節指令和3字節指令。
? ? ? ? 下面,我們將對匯編指令的一般格式與按字節數分類的指令作詳細講解。
(一)匯編指令的一般格式
1、標號
(1)定義:標號是用戶自定義的符號,用于表示指令所在的地址,方便在程序中進行跳轉、調用等操作。
(2)命名規則:由字母、數字和下劃線組成,但不能以數字開頭,且不能使用匯編語言的保留字(如操作碼、寄存器名等)。
(3)示例:?“START:”表示程序開始的位置,在后續的指令中可以使用這個標號進行跳轉。如使用“AJMP START”會使程序跳轉到 START 標號所在的指令處繼續執行。
2、操作碼
(1)定義:操作碼是匯編指令的核心部分,它規定了指令要執行的操作類型,明確指令所執行的具體操作功能。如數據傳送、算術運算、邏輯運算等。
(2)示例:MOV 表示數據傳送操作,ADD 表示加法運算,SJMP 表示短跳轉操作。
3、操作數
(1) 定義:操作數是指令操作的對象,可以是數據本身,也可以是數據所在的地址。操作數的個數根據指令的不同而有所變化,指令沒有操作數,最多可以有三個。
(2)分類及示例
? ? ? ? ① 立即數:直接出現在指令中的數據,用符號“#”表示。例如,MOV A, #30H 表示將立即數 30H 傳送到累加器 A 中。
? ? ? ? ②?寄存器:使用單片機內部的寄存器作為操作數。例如,MOV A, R0 表示將寄存器 R0 中的數據傳送到累加器 A 中。
? ? ? ? ③?直接地址:直接給出操作數所在的內存地址。例如,MOV A, 30H 表示將內部數據存儲器地址為 30H 單元中的數據傳送到累加器 A 中。
? ? ? ? ④?間接地址:操作數的地址存放在寄存器中,通過寄存器間接找到操作數。例如,MOV A, @R0 表示將寄存器 R0 中的值作為地址,把該地址單元中的數據傳送到累加器 A 中。
4、注釋
(1)定義:注釋是為了提高程序的可讀性而添加的說明性文字,不會被翻譯成機器代碼。
(2)格式:?以“;” 開頭,后面可以跟任意文本。
(3)示例:MOV A, #30H ; 將立即數30H傳送到累加器A中。
以下是一個完整的51單片機匯編語言程序示例:
????????這個示例展示了匯編語言程序的基本結構和指令格式,包含了標號、操作碼、操作數和注釋等部分。
(二)按字節數分類的指令
1、單字節指令
(1)指令構成:在 51 單片機指令體系中,單字節指令僅占一個字節的程序存儲空間,操作碼和可能的操作數信息都包含在這一字節內。
(2)示例分析:以 “ INC Rn” 為例,“INC” 是操作碼,表示加 1 操作,特定編碼指定操作對象為寄存器 Rn。如執行 “INC R0”,會將寄存器 R0 數據加 1。這類指令占空間小、執行快。
(3)應用場景:適用于對寄存器進行簡單計數,如循環程序中對多個寄存器依次計數;也用于位操作算法,如 “RL A” 指令在數據加密中對二進制數據移位混淆。
2、雙字節指令
(1)指令構成:在程序存儲器中占兩個字節,首字節為操作碼,明確操作類型,次字節表示操作數或其地址。
(2)示例分析:“MOV A, #data” 中,首字節 “MOV” 為操作碼,次字節 “#data” 是要傳送到累加器 A 的立即數,如 “MOV A, #30H”。“SJMP rel” 中,首字節 “SJMP” 為短跳轉操作碼,次字節 “rel” 是相對偏移量,決定程序跳轉目標地址。
(3)應用場景:常用于初始化變量,如 “MOV P1, #0FFH” 設置端口 P1 初始狀態;也用于程序流程控制,實現短距離條件跳轉或循環。
3、三字節指令
(1)指令構成:在程序存儲器中占三個字節,首字節為操作碼,后兩字節表示操作數或其地址信息。
(2)示例分析:“LJMP addr16” 中,首字節 “LJMP” 為長跳轉操作碼,后兩字節 “addr16” 是 16 位目標地址,可實現 64KB 程序空間內任意跳轉。“MOV direct1, direct2” 中,首字節 “MOV” 為數據傳送操作碼,第二、三字節分別是目的和源操作數地址。
(3)應用場景:大型程序中,“LJMP addr16” 用于大范圍改變執行流程;數據存儲與搬運時,“MOV direct1, direct2” 實現不同直接尋址單元間的數據轉移。
????????匯編指令能夠精準地控制單片機的硬件資源,適用于對程序執行效率要求極高、對硬件資源操作精細的場景,如底層驅動開發等。在 51 單片機開發中,匯編語言仍然被廣泛應用,尤其是在一些小型、對資源要求苛刻的項目中。?
三、高級指令
????????隨著單片機應用的不斷發展,高級程序設計語言在單片機開發中也逐漸普及。像 C 語言這樣的高級語言,具有豐富的數據類型、靈活的控制結構以及良好的可移植性。人們把“51單片機 C 語言”稱為“C51”。
????????以 C51 為例,在 51 單片機開發中,開發者可以使用變量、數組、結構體等數據類型,通過函數來組織代碼邏輯。例如,使用 C51 編寫一個簡單的點亮 LED 燈的程序:
#include <reg51.h> // 包含51單片機的頭文件
sbit LED = P1^0; // 定義P1.0口為LED控制引腳
void main() {while(1) {LED = 0; // 點亮LED}
}
????????在這段代碼中,雖然沒有直接出現匯編指令中的操作碼和操作數,但編譯器會將這些高級語言代碼轉換為對應的匯編指令,進而生成機器指令,從而執行對應的功能。
????????高級語言指令使得開發者可以更專注于程序的功能實現,而無需過多關注底層硬件細節,大大提高了開發效率。
????????不過,由于高級語言代碼在編譯過程中會生成相對較多的中間代碼,在對資源和執行效率要求極為嚴格的情況下,可能需要結合匯編語言進行優化。
總結?
????????51 單片機指令系統雖內容繁雜,但只要從機器指令、匯編指令、高級指令?這三個層面入手,掌握其基本概念、弄清其基本形式,了解其使用場景,同時掌握三者間的關系,就可以實現51單片機指令系統的入門。