一個單片機所需執行指令的集合即為單片機的指令系統。單片機使用的機器語言、彙編語言及高級語言,但不管使用是何種語言,最終還是要“翻譯”成為機器碼,單片機才能執行之。現在有很多半導體廠商都推出了自己的單片機,單片機種類繁多,品種數不勝數,值得注意的是不同的單片機它們的指令系統不一定相同,或不完全相同。但不管是使用機器語言、彙編語言還是高級語言都是使用指令編寫程序的。 所謂機器語言即指令的二進位編碼,而彙編語言則是指令的表示符號 。在指令的表達式上也不會直接使用二進位機器碼,最常用的是十六進位的形式。但單片機並不能直接執行彙編語言和高級語言,都必須通過彙編器“翻譯”成為二進位機器碼方能執行,但如果直接使用二進位來編寫程序,那將十分不便,也很難記憶和識別,不易編寫、難於辨讀,極易出錯,同時出錯了也相當難查找。所以現在基本上都不會直接使用機器語言來編寫單片機的程序。最好的辦法就是使用易於閱讀和辨認的指令符號來代替機器碼,我們常稱這些符號為助記符,用助記符的形式表示的單片機指令就是彙編語言,為便於記憶和閱讀,助記符號通常都使用易於理解的英文單詞和拼音字母來表示。 每種單片機都有自己獨特的指令系統,那麼指令系統是開發和生產廠商定義的,如要使用其單片機,用戶就必須理解和遵循這些指令標準,要掌握某種(類)單片機,指令系統的學習是必須的。 MCS-51共有111條指令,可分為5類: |
[1].數據傳送類指令(共29條) |
[2].算數運算類指令(共24條) |
[3].邏輯運算及移位類指令(共24條) |
[4].控制轉移類指令(共17條) |
[5].布爾變數操作類指令(共17條) |
一些特殊符號的意義 在介紹指令系統前,我們先了解一些特殊符號的意義,這對今後程序的編寫都是相當有用的。 |
Rn——當前選中的寄存器區的8個工作寄存器R0—R7(n=0-7)。 |
Ri——當前選中的寄存器區中可作為地址寄存器的兩個寄存器R0和R1(i=0,1) |
direct—內部數據存儲單元的8位地址。包含0—127(255)內部存儲單元地址和特殊功能寄存地址。 |
#data—指令中的8位常數。 |
#data16—指令中的16位常數。 |
addr16—用於LCALL和LJMP指令中的16目的地地址,目的地址的空間為64kB程序存儲器地址。 |
#addr11—用於ACALL和AJMP指令中的11目的地地址,目的地址必須放在與下條指令第一個位元組同一個2kB程序存儲器空間之中。 |
rel—8位帶符號的偏移位元組,用於所有的條件轉移和SJMP等指令中,偏移位元組對於下條指令的第一個位元組開始的-128——+127範圍內。 |
@—間接寄存器定址或基址寄存器的前綴。 |
/—為操作的前綴,聲明對該位操作書取反。 |
DPTR—數據指針。 |
bit—內部RAM和特殊功能寄存器的直接定址位。 |
A—累加器。 |
B—累加器B。用於乘法和除法指令中。 |
C—進位標誌位。 |
(x)—某地址單元中的內容。 |
((x))—由X定址單元中的內容。 |
MCS-51的定址方式 定址的“地址”即為操作數所在單元的地址,絕大部分指令執行時都需要用到操作數,那麼到哪裡去取得操作數呢?最易想到的就是告訴CPU操作數所在的地址單元,從那裡可取得響應的操作數,這便是“定址”之意。MCS-51的定址方式很多,使用起來也相當方便,功能也很強大,靈活性強。這便是MCS-51指令系統“好用”的原因之一。下面我們分別討論幾種定址方式的原理。 [1].直接定址 指令中操作數直接以單元地址形式出現,例如: MOV A,68H 這條指令的意義是把內部RAM中的68H單元中的數據內容傳送到累加器A中。值得注意的是直接定址方式只能使用8位二進位地址,因此這種定址方式僅限於內部RAM進行定址。低128位單元在指令中直接以單元地址的形式給出。對於特殊功能寄存器可以使用其直接地址進行訪問,還可以以它們的符號形式給出,只是特殊功能寄存器只能用直接定址方式訪問,而無其它方法。 [2].寄存器定址 寄存器定址對選定的8個工作寄存器R0-R7進行操作,也就是操作數在寄存器中,因此指定了寄存器就得到了操作數,寄存器定址的指令中以寄存器的符號來表示寄存器,例如: MOV A,R1 這條指令的意義是把所用的工作寄存器組中的R3的內容送到累加器A中。 值得一提的是工作狀態寄存器的選擇是通過程序狀態字寄存器來控制的,在這條指令前,應通過PSW設定當前工作寄存器組。 [3].寄存器間接定址 寄存器定址方式,寄存器中存放的是操作數,而寄存器間接定址方式,寄存器中存放的則為操作數的地址,也即操作數是通過寄存器指向的地址單元得到的,這便是寄存器間接定址名稱的由來。 例如指令: MOV A,@R0 這條指令的意義是R0寄存器指向地址單元中的內容送到累加器A中。假如R0=#56H,那麼是將56H單元中的數據送到累加器A中。 寄存器間接定址方式可用於訪問內部RAM或外部數據存儲器。訪問內部RAM或外部數據存儲器的低256位元組時,可通過R0和R1作為間接寄存器。然而有必要指出,內部RAM的高128位元組地址與專用積存器的地址是重疊的,所以這種定址方式不能用於訪問特殊功能寄存器。 外部數據存儲器的空間為64kB,這時可採用DPTR作為間址寄存器進行訪問,指令如下: MOVX A,@DPTR 這條指令的意義是與上述類似,不再贅述。 [4].立即定址 立即定址就是把操作數直接在指令中給出,即操作數包含在指令中,指令操作碼的後面緊跟著操作數,一般把指令中的操作數稱為立即數,因此而得名。為了與直接定址方式相區別,在立即數前加上“#”符號,例如: MOVX A,#0EH 這條指令的意義是將0EH這個操作數送到累加器A中。 [5].變址定址 變址定址是以DPTR或PC作為基址寄存器,以累加器A作為變址寄存器,將兩寄存器的內容相加形成16位地址形成操作數的實際地址。例如: MOV A,@A+DPTR MOVX A,@A+PC JMP @A+DPTR 在這三條指令中,A作為偏移量寄存器,DPTR或PC作為變址寄存器,A作為無符號數與DPTR或PC的內容相加,得到訪問的實際地址。其中前兩條是程序存儲器讀指令,后一條是無條件轉移指令。 [6].λѰַ 在MCS-51單片機中,RAM中的20H—2FH位元組單元對應的位地址為00H—7FH,特殊功能寄存器中的某些位也可進行為定址,這些單元既可以採用位元組方式訪問它們,也可採用位定址的方式訪問它們。 [7].相對定址 相對定址方式是為了程序的相對轉移而設計的,其夜裡是以PC的內容為基址,加上給出的偏移量作為轉移地址,從而實現程序的轉移。轉移的目的地址可參見如下表達式: 目的地址=轉移指令地址+轉移指令字接數+偏移量 值得注意的是,偏移量是有正負號之分的,偏移量的取值範圍是當前PC值的-128—+127之間 |