單片機原理與應用(倪云峰)全書第3章_第1頁
單片機原理與應用(倪云峰)全書第3章_第2頁
單片機原理與應用(倪云峰)全書第3章_第3頁
單片機原理與應用(倪云峰)全書第3章_第4頁
單片機原理與應用(倪云峰)全書第3章_第5頁
已閱讀5頁,還剩243頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 3 章 指令系統及匯編語言程序設計3.1 MCS-51單片機匯編語言與指令格式3.2 尋址方式3.3 MCS-51單片機指令系統3.4 匯編語言及匯編語言程序設計3.5 基本程序設計方法本章小結習題 第 3 章 指令系統及匯編語言程序設計3.1.1 單片機的匯編語言單片機的匯編語言由于計算機只能識別二進制機器語言代碼,它是一種用二進制數0、1組成的代碼,不易辨識、記憶和書寫,因此難以直接用它來進行程序設計。為了既能體現機器語言的特點,又便于人們理解、記憶和書寫,計算機常采用助記符來編寫指令。助記符是根據機器指令的不同功能和操作對象來描述指令的,它采用有關的英文縮寫來描述指令的特征,因此便于

2、記憶、理解和分類。這種采用助記符和其他一些符號所編寫的指令程序稱為匯編語言源程序。3.1 MCS-51單片機匯編語言與指令格式單片機匯編語言與指令格式 第 3 章 指令系統及匯編語言程序設計3.1.2 指令格式指令格式MCS-51的指令有111條,分別表征30多種基本指令功能。其匯編指令格式如下:標號:操作碼 目的操作數,源操作數 ;注釋標號是該指令的符號地址,表明該指令在程序中的位置,在其他指令中可被引用,經常出現在轉移指令中,可根據需要設置。標號后用“:”與操作碼分隔開。標號的命名應符合字符集,即英語的大小寫字母(az,AZ)、數字09。標號嚴禁使用保留字符,如指令助記符、偽指令、常數等語

3、言規范中已經使用了的符號,長度不能超過8個字符。第 3 章 指令系統及匯編語言程序設計操作碼和操作數是指令的核心部分,二者之間用空格分隔。操作碼的作用是命令CPU作何操作;操作數則是該操作指令的作用對象,分為目的操作數和源操作數,二者之間用“,”分開。有些指令中無操作數,有些只有一個操作數。注釋是對該指令功能的解釋,主要是便于理解和閱讀程序,可根據需要適當添加,編譯器對注釋是不作處理的。注釋之前要用“;”與操作指令分開。從指令的二進制代碼表示的角度看,指令格式以8位二進制(1B)為基礎,分為單字節、雙字節和三字節指令。 第 3 章 指令系統及匯編語言程序設計1. 單字節指令單字節指令 單字節指

4、令的二進制代碼只有一個字節。單字節指令分為兩類:一類是無操作數的單字節指令,其指令碼只有操作碼字段,操作數是隱含在操作碼中的;另一類是含有操作數寄存器編號的單字節指令,其指令碼由操作碼字段和用來指示操作數所在寄存器號的地址碼組成。其格式如下:7 0 操作碼 (地址碼) 第 3 章 指令系統及匯編語言程序設計2. 雙字節指令雙字節指令 雙字節指令的二進制代碼有兩個字節:第一個字節是操作碼(或操作碼加操作數所在寄存器的地址碼),第二個字節是數據或數據所在的地址碼。其格式如下: 7 0 第一字節 操作碼 (地址碼) 第二字節 數據或地址碼 第 3 章 指令系統及匯編語言程序設計3. 三字節指令三字節

5、指令三字節指令中,第一字節是操作碼,第二和第三字節是操作數或操作數地址。其格式如下: 7 0 第一字節 操作碼 第二字節 數據或地址碼 第三字節 數據或地址碼 第 3 章 指令系統及匯編語言程序設計3.1.3 指令中的常用符號指令中的常用符號在分類介紹各類指令之前,下面先對描述指令的一些符號的意義進行簡單約定。(1) Ri和Rn:R表示當前工作寄存器區中的工作寄存器;i表示0或1,即R0和R1;n表示07,即R0R7。當前工作寄存器的選定是由PSW的RS1位和RS0位決定的。(2) #data:#表示立即數,data為8位常數。#data是指包含在指令中的8位立即數。(3) #data16:包

6、含在指令中的16位立即數。第 3 章 指令系統及匯編語言程序設計(4) rel:相對地址,以補碼形式表示的地址偏移量,范圍為-128+127,主要用于無條件相對短轉移指令SJMP和所有的條件轉移指令中。(5) addr16:16位目的地址。目的地址可在全部程序存儲器的64 KB空間范圍內,主要用于無條件長轉移指令LJMP和子程序長調用指令LCALL中。(6) addr11:11位目的地址。目的地址應與下一條指令處于相同的2 KB程序存儲器地址空間范圍內,主要用于絕對轉移指令AJMP和子程序絕對調用指令ACALL中。第 3 章 指令系統及匯編語言程序設計(7) direct:表示直接尋址的地址,

7、即8位內部數據存儲器RAM的單元地址(0127/255),或特殊功能寄存器SFR的地址。對于SFR,可直接用其名稱來代替其直接地址。(8) bit:內部數據存儲器RAM和特殊功能寄存器SFR中的可直接尋址位地址。(9) :間接尋址寄存器或基地址寄存器的前綴(如Ri、DPTR),表示寄存器間接尋址。 第 3 章 指令系統及匯編語言程序設計(10) (x):表示x中的內容。(11) (x):表示由x尋址的單元中的內容,即(x)為地址,該地址的內容用(x)表示。(12) /和符號:/表示對該位操作數取反,但不影響該位的原值;表示指令操作流程,將箭頭一方的內容送入箭頭另一方的單元中。第 3 章 指令系

8、統及匯編語言程序設計3.2.1 寄存器尋址寄存器尋址指令中的操作數是放在寄存器中的,找到了寄存器就可得到操作數,這種尋址方式稱為寄存器尋址。寄存器尋址的工作寄存器指的是R0R7、累加器A、寄存器B、數據指針DPTR、CY(作為位處理累加器)等。例如:機器碼 助記符11101011 MOV A,R33.2 尋尋 址址 方方 式式 第 3 章 指令系統及匯編語言程序設計這條指令表示寄存器送數給累加器,為一條單字節指令,低3位011代表工作寄存器R3的地址,高5位11101代表從寄存器往累加器A送數據的操作。該指令的低3位可從000到111變化,分別代表了R0R7。設R3中的操作數是B9H,上述指令

9、的尋址過程如圖3.1所示。第 3 章 指令系統及匯編語言程序設計圖3.1 寄存器尋址方式示意圖第 3 章 指令系統及匯編語言程序設計3.2.2 立即尋址立即尋址指令的源操作數是一個數值,這種操作數被稱做立即數,在指令中用“#”作為其前綴。含有立即數的指令的指令碼中,操作碼后面的字節內容就是操作數本身,不需要到其他地址單元去取,這種尋址方式被稱為立即尋址方式。例如:機器碼 助記符 注釋74 FA MOV A,#0FAH ;A FAHFAH是立即數,74H是操作碼,指令功能是將立即數送入累加器A。程序存儲器中指令以機器碼的形式存放(機器碼由系統自動生成,實際編程不需要寫出),上述指令的尋址過程如圖

10、3.2所示。第 3 章 指令系統及匯編語言程序設計圖3.2 立即尋址方式示意圖第 3 章 指令系統及匯編語言程序設計在MCS-51指令系統中還有一條16bit立即尋址指令。例如:機器碼 助記符 注釋90 30 01 MOV DPTR,#3001H ;DPH 30H,DPL 01H 上述指令的功能是將16bit立即數3001H送給數據指針DPTR。第 3 章 指令系統及匯編語言程序設計3.2.3 寄存器間接尋址寄存器間接尋址寄存器的內容不是操作數本身,而是存放操作數的地址,要獲取操作數需要通過寄存器間接得到,這種尋址方式稱為寄存器間接尋址。寄存器間接尋址只能使用寄存器R0或R1作為間接地址寄存器

11、來尋址內部RAM(00HFFH)中的數據。寄存器前用符號“”表示采用間接尋址方式。對于內部RAM有256B的52系列單片機,其高128B(80HFFH)只能采用寄存器間接尋址方式,以避免和同樣采用此區地址的SFR發生沖突。第 3 章 指令系統及匯編語言程序設計寄存器間接尋址也適用于訪問外部RAM,用DPTR作為間接尋址寄存器可尋址64KB空間。對于外部RAM的低256B單元,也可用R0、R1作為間接尋址寄存器。值得注意的是,寄存器間接尋址方式不能用于尋址特殊功能寄存器。例如: MOV A,R1 ;A(R1)上述指令的功能是把R1所指出的內部RAM單元中的內容送到累加器A。若R1的內容為40H,

12、內部RAM的40H單元中的內容是0A6H,則指令“MOV A,R1”的功能是將0A6H這個數送到累加器A,如圖3.3所示。第 3 章 指令系統及匯編語言程序設計圖3.3 寄存器間接尋址示意圖第 3 章 指令系統及匯編語言程序設計若R1的內容是90H,則“MOV A,R1”是將內部RAM 90H(52子系列)單元的值送給累加器A。又因為90H是特殊功能寄存器P1的地址,所以要尋址P1的話,需要采用直接尋址的方式,即“MOV A,90H”才表示將P1的內容送到累加器A,請注意區別。第 3 章 指令系統及匯編語言程序設計3.2.4 直接尋址直接尋址指令中直接給出操作數所在的存儲器地址,以供尋址取數或

13、存數的尋址方式稱為直接尋址。例如:MOV A,50H ;(A)(50H)該指令的功能是把內部數據存儲器RAM 50H單元內的內容送到累加器A。該指令直接給出了源操作數的地址50H。該指令的機器碼為E5H 50H。MCS-51系列單片機的直接尋址可用于訪問內部數據存儲器,也可用于訪問程序存儲器。第 3 章 指令系統及匯編語言程序設計直接尋址可訪問內部RAM的低128B單元(00H7FH),同時也是訪問高128B單元的特殊功能寄存器SFR的唯一方法。由于SFR占用片內RAM 80HFFH間的地址,因此對于MCS-51系列單片機,片內RAM只有128B單元,與SFR的地址沒有重疊,對于MCS-52系

14、列,片內RAM有256B單元,其高128B單元與SFR的地址是重疊的。第 3 章 指令系統及匯編語言程序設計為避免混淆,單片機規定:直接尋址的指令不能訪問片內RAM的高128B單元(80HFFH)。若要訪問這些單元,則只能用寄存器間接尋址指令,而要訪問SFR只能用直接尋址指令。另外,訪問SFR可在指令中直接使用該寄存器的名字來代替地址,如“MOV A,80H”可以寫成“MOV A,P0”,因為P0口的地址為80H。直接尋址還可直接訪問片內221個位地址空間。第 3 章 指令系統及匯編語言程序設計直接尋址訪問程序存儲器的有長轉移指令LJMP addr16、絕對轉移指令AJMP addr11、長調

15、用指令LCALL addr16與絕對調用指令ACALL addr11,它們都直接給出了程序存儲器的16位地址(尋址范圍覆蓋64 KB)或11位地址(覆蓋2 KB)。執行這些指令后,程序計數器PC的低16位或低11位地址將更換為指令直接給出的地址,機器將改為訪問以所給地址為起始地址的存儲器區間。第 3 章 指令系統及匯編語言程序設計3.2.5 變址尋址變址尋址這種尋址方式常用于訪問程序存儲器中的數據表格。變址尋址把基址寄存器(DPTR或PC)和變址寄存器A的內容作為無符號數相加形成16位的地址,該地址單元中所存放的數據為所需的操作數。例如:MOVC A,A+DPTR ;A(DPTR)+()MOV

16、C A,A+PC ;A(PC)+()A中為無符號數,指令功能是把A的內容和DPTR的內容或當前PC的內容相加得到程序存儲器的有效地址,把該存儲器單元中的內容送到A?!癕OVC A,A+DPTR”的指令碼是93H,尋址過程如圖3.4所示。第 3 章 指令系統及匯編語言程序設計圖3.4 基址寄存器加變址寄存器間接尋址示意圖第 3 章 指令系統及匯編語言程序設計3.2.6 相對尋址相對尋址程序的執行中往往有相對轉移的需要,即以當前指令的位置(PC值)為基準點,加上指令中給出的相對偏移量(rel)來獲得操作數所在的實際地址。這類尋址方式稱為相對尋址,是轉移指令中用到的尋址方式。偏移量rel是符號數,在

17、-128+127范圍內,用補碼表示為80H7FH,實際應用中常用符號地址代替。例如:指令 JC rel ;C=1跳轉 上述指令的機器碼為40H rel。第 3 章 指令系統及匯編語言程序設計第一字節為操作碼,第二字節就是相對于程序計數器PC當前地址的偏移量rel。注意注意:這里的“PC當前地址”是指執行完這條“JC rel”指令后的PC值,而不是指向該條指令的PC值。若轉移指令操作碼存放在0500H單元,偏移量存放在0501H單元,則該指令執行后PC已為0502H。若偏移量rel為05H,則轉移到的目標地址為0507H,即當C=1時,將去執行0507H單元中的指令。具體過程見后面相關的指令介紹

18、。 第 3 章 指令系統及匯編語言程序設計3.2.7 位尋址位尋址MCS-51系列單片機具有位尋址功能,即指令中直接給出位地址,可以對內部數據存儲器RAM中的128位和特殊寄存器SFR中的93位進行尋址,并且位操作指令可對地址空間的每一位進行傳送與邏輯操作。第 3 章 指令系統及匯編語言程序設計例如:SETB PSW.3 ;(PSW.3)1該指令的功能是給程序狀態字PSW中的RS0置1。該指令為雙字節指令,機器代碼為D2H D3H,指令的第二字節直接給出位地址D3H (PSW.3的位地址)。綜上所述,在MCS-51系列單片機的存儲空間中,指令究竟對哪個存儲器空間進行操作是由指令操作碼和尋址方式

19、確定的。7種尋址方式及使用空間如表3.1所示。第 3 章 指令系統及匯編語言程序設計表表3.1 7種尋址方式及使用空間種尋址方式及使用空間尋 址 方 式 使 用 空 間 寄存器尋址 R0R7、A、B、CY、DPTR 寄存器 立即尋址 程序存儲器 寄存器間接尋址 內部 RAM 的 00HFFH、外部 RAM 直接尋址 內部 RAM 的 00H7FH、SFR、程序存儲器 變址尋址 程序存儲器 相對尋址 程序存儲器 位尋址 內部 RAM 中 20H2FH、SFR 第 3 章 指令系統及匯編語言程序設計3.3.1 數據傳送類指令數據傳送類指令數據傳送類指令共29條,是指令系統中最活躍、使用最多的一類指

20、令。一般的操作是把源操作數傳送到目的操作數,即指令執行后目的操作數改為源操作數,而源操作數保持不變。若要求在進行數據傳送時,不丟失目的操作數,則可以用交換型傳送指令。3.3 MCS-51單片機指令系統單片機指令系統第 3 章 指令系統及匯編語言程序設計數據傳送類指令不影響進位標志CY、半進位標志AC和溢出標志OV,但當傳送或交換數據后影響累加器A的值時,奇偶標志P的值應按A的值重新設定。按數據傳送類指令的操作方式,又可把傳送類指令分為3種類型:數據傳送、數據交換和堆棧操作,并使用8種助記符(MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH及POP)。表3.2給出了各種數據傳送類

21、指令的助記符和對應的操作數。第 3 章 指令系統及匯編語言程序設計表表3.2 數據傳送類指令的助記符與操作數數據傳送類指令的助記符與操作數功 能 助 記 符 操作數與傳送方向 內部數據存儲器傳送 MOV ARnRidirect? #data DPTR? #data16 ARn Ridirect directdirectRnRi 外部數據存儲器傳送 MOVX ARiDPTR 數據傳送 程序存儲器傳送 MOVC A? A+DPTRA+PC 字節交換 XCH A RnRidirect 半字節交換 XCHD A 低四位Ri 低四位 數據交換 A 高低 4 位互換 SWAP A 低四位A 高四位 壓入堆

22、棧 PUSH 堆棧操作 彈出堆棧 POP SPdirect 第 3 章 指令系統及匯編語言程序設計1內部數據存儲器數據傳送指令內部數據存儲器數據傳送指令內部數據存儲器RAM區是數據傳送最活躍的區域,可用的指令數也最多,共有16條指令,指令操作碼助記符為MOV。內部RAM間的數據傳遞關系如圖3.5所示。為了便于理解指令功能,下面按對源操作數的尋址方式逐一介紹各條指令。第 3 章 指令系統及匯編語言程序設計圖3.5 內部RAM間的數據傳遞關系圖第 3 章 指令系統及匯編語言程序設計1) 立即尋址 該尋址方式下,內部RAM區的數據傳送指令有如下5條。這里描述指令格式的約定次序為操作碼助記符、目的操作

23、數、源操作數、功能注釋,以下類同,不再說明。操作碼助記符 目的操作數 源操作數 功能注釋 操作碼助記符 目的操作數 源操作數 功能注釋 MOV Ri, #data ;(Ri)? #data MOV Rn, #data ;(Rn)? #data MOV DPTR, #data16 ;(DPTR)? #data16 MOV A, #data ;(A)? #data MOV direct, #data ;(direct)? #data 第 3 章 指令系統及匯編語言程序設計這組指令表明,8位立即數可以直接傳送到內部數據區RAM的各個位置,并且可把16位立即數直接裝入數據指針DPTR。其他相關指令的功

24、能及應用舉例如下:(1) MOV direct,#data ;(direct)#data 該指令的功能是把立即數傳送到內部數據存儲器RAM的00H7FH以及特殊功能寄存器SFR的各單元中。該指令為三字節指令。例如,把立即數20H傳送到RAM的30H單元和P1口(口地址為90H),可采用如下指令:MOV 30H,#20H ;(30H)#20H MOV P1,#20H ;(90H)#20H (2) MOV Ri,#data ;(Ri)#data 第 3 章 指令系統及匯編語言程序設計該指令的功能是把立即數傳送到由R0和R1寄存器的內容指出的片內數據存儲器RAM的單元中(MCS-51系列為00H7F

25、H,MCS-52系列為00HFFH)。當使用R0和R1寄存器時,機器代碼分別為76H和77H,而R0、R1屬于片內RAM中的哪一組工作寄存器,則要由PSW中的RS1和RS0決定。如果要把立即數60H傳送到RAM的30H單元,則需用如下兩條指令:MOV R0,#30H ;(R0)#30HMOV R0,#60H ;(R0)#60H 由此可見,完成同樣的功能,所用指令不同,程序所占空間不同,執行效率也不同。因此,在實際編程時要注意程序的優化。第 3 章 指令系統及匯編語言程序設計(3) MOV Rn,#data ;(Rn)#data該指令的功能是把立即數傳送到內部寄存器R0R7中,該指令為雙字節指令

26、,機器代碼如下:0 1 1 1 1 r r r data 其中,rrr取值為000、001、110、111,對應R0、R1、R6、R7共8個寄存器,機器代碼為78、79、7E、7F。但在片內RAM中屬于哪一組的R0R7,也要由PSW中RSl和RS0的設置而定。該指令共對應8條指令,但在MCS-51單片機指令系統中,該指令只統計為一條。第 3 章 指令系統及匯編語言程序設計(4) MOV DPTR,#data16 ;(DPTR)#data16該指令的功能是把16位立即數裝入數據指針DPTR中。該指令是MCS-51系列單片機指令系統中唯一一條16位數據傳送指令。該指令為三字節指令,第一字節為90H

27、,第二字節為高8位立即數,第三字節為低8位立即數。例如,“MOV DPTR,#5534H”指令執行后,DPTR寄存器的高8位寄存器DPH的內容為55H,低8位寄存器DPL的內容為34H。該指令的機器代碼為90H 55H 34H。第 3 章 指令系統及匯編語言程序設計2) 寄存器尋址在該尋址方式下,內部RAM區的數據傳送指令有以下5條:MOV direct,A ;(direct)(A) MOV Ri,A ;(Ri)(A) MOV Rn,A ;(Rn)(A) MOV A,Rn ;(A)(Rn) MOV direct,Rn ;(direct)(Rn) 第 3 章 指令系統及匯編語言程序設計這組指令的

28、功能是把累加器A的內容傳送到內部數據區RAM的各個單元,或者把指定工作寄存器R0R7中的內容傳送到累加器A、direct所指定的片內RAM的00H7FH單元或特殊功能寄存器SFR中。但不能用這類指令在內部工作寄存器之間直接傳送。例如,不存在“MOV R1,R2”這樣的指令。第 3 章 指令系統及匯編語言程序設計3) 直接尋址在該尋址方式下,內部RAM區的數據傳送指令有如下4條:MOV A,direct ;(A)(direct) MOV Rn,direct ;(Rn)(direct) MOV Ri,direct ;(Ri)(direct) MOV direct2,direct1 ;(direct

29、2)(direct1) 第 3 章 指令系統及匯編語言程序設計這組指令將直接地址所規定的內部RAM單元(片內RAM的00H7FH,SFR的80HFFH單元)的內容傳送到累加器A、寄存器Rn,并能實現內部數據寄存器RAM之間、特殊功能寄存器SFR之間或SFR與內部RAM之間的直接數據傳遞。直接傳遞不需要通過累加器A或者工作寄存器來間接傳送,從而提高了數據傳送的效率。注意注意:52子系列單片機的片內RAM高128B單元(80HFFH)不能用直接尋址的方法傳送到RAM的其他部分,而只能用間接尋址的方法來進行傳送。另外,訪問SFR 80HFFH地址中沒有定義的單元是沒有意義的。第 3 章 指令系統及匯

30、編語言程序設計例如:MOV P2,P1 ;(P2)(P1) 該指令的功能是不通過其他寄存器,直接把P1口(端口地址90H)的內容傳送到P2口(端口地址A0H)輸出,提高了效率。該指令為三字節指令,機器代碼為85H 90H A0H。4) 寄存器間接尋址在該尋址方式下,內部RAM區的數據傳送指令有以下兩條:MOV A, Ri ;(A)(Ri) MOV direct,Ri ;(direct)(Ri) 第 3 章 指令系統及匯編語言程序設計這組指令把以Ri的內容作為地址進行尋址所得到的單元的內容,傳送到累加器A或direct指定的片內RAM區單元。間接尋址可訪問片內數據存儲器的低128B單元(00H7

31、FH)和高128B單元(80HFFH,對52子系列),但不能用于尋址特殊功能寄存器SFR。第 3 章 指令系統及匯編語言程序設計例如:設內部RAM(30H)=40H,(40H)=10H,(10H)=00H,端口(P1)=CAH,分析以下程序執行后各單元及寄存器、P2口的內容。MOV R0,#30H ;(R0)30H MOV A,R0 ;(A)(R0) MOV R1,A ;(R1)(A) MOV B,R1 ;(B)(R1) MOV R1,P1 ;(R1)(P1) MOV P2,P1 ;(P2)(P1) MOV 10H,#30H ;(10H)30H 執行上述指令后結果為:(R0)=30H,(R1)

32、=(A)=40H,(B)=10H,(40H)=CAH,(P1)=(P2)=CAH,(10H)=30H。第 3 章 指令系統及匯編語言程序設計2外部數據存儲器數據傳送指令外部數據存儲器數據傳送指令1) 16位數傳送指令該指令將16位立即數送入DPTR,高8位送入DPH,低8位送入DPL,如表3.3所示。這個16位立即數實質是外部RAM/ROM的地址,專門用來配合外部數據傳送指令。第 3 章 指令系統及匯編語言程序設計表表3.3 16位數傳送指令位數傳送指令匯 編 指 令 操 作 MOV DPTR,#data16; (DPTR) ? #data16 第 3 章 指令系統及匯編語言程序設計2) 累加

33、器與外部RAM的數據傳送指令該類指令在累加器A與外部數據存儲器RAM之間傳送一個字節的數據,采用間接尋址方式尋址外部數據存儲器,如表3.4所示。第 3 章 指令系統及匯編語言程序設計表表3.4 累加器與外部累加器與外部RAM的數據傳送指令的數據傳送指令匯 編 指 令 操 作 MOVX A,Ri; (A) ? (Ri) MOVX A,DPTR; (A) ? (DPTR) MOVX Ri,A; (Ri)? (A) MOVX DPTR ,A; (DPTR)? (A) 第 3 章 指令系統及匯編語言程序設計前兩條指令將外部RAM的數據傳送到累加器,后兩條指令則是將累加器數據傳送到外部RAM。CPU與外

34、部RAM的數據交換只能通過累加器A進行。以工作寄存器R0、R1作間接尋址可尋址外部RAM的低256個數據單元,地址范圍為0000H00FFH;以16位數據指針DPTR間接尋址可訪問外部RAM的64KB數據單元。第 3 章 指令系統及匯編語言程序設計【例【例3.1】 設外部RAM的4FH單元中的數據需要調入CPU,處理完后的數據放入外部RAM的1000H單元??刹捎萌缦轮噶钔瓿桑篗OV R0,#4FHMOVX A,R0 ;設處理后的數據已經放入AMOV DPTR,#1000HMOVX DPTR,A第 3 章 指令系統及匯編語言程序設計3程序存儲器向累加器程序存儲器向累加器A傳送數據指令傳送數據指

35、令程序存儲器向累加器A傳送數據指令又稱查表指令。該指令采用變址尋址方式,把程序存儲器(ROM或EPROM)中存放的表格數據讀出,傳送到累加器A,如表3.5所示。第 3 章 指令系統及匯編語言程序設計表表3.5 程序存儲器向累加器程序存儲器向累加器A傳送數據指令傳送數據指令匯 編 指 令 操 作 MOVC A,A+DPTR; (A) ? (A)+(DPTR) MOVC A,A+PC; (PC)? (PC)+1,(A) ? (A)+(PC) 第 3 章 指令系統及匯編語言程序設計上述兩條指令的功能是把作為變址寄存器的累加器A中的內容與基址寄存器(DPTR或PC)的內容進行16位無符號數的加法操作,

36、得到程序存儲器某單元地址,再把該地址的內容送入累加器A0,執行指令后基址寄存器DPTR的內容不變,PC的內容為(PC)+1。由于執行16位加法,因此從低8位產生的進位將傳送到高位,不影響任何標志位。前一條指令采用DPTR作為基址寄存器,因此可以很方便地把一個16位地址送到DPTR,實現在整個64 KB程序存儲器單元到累加器A的數據傳送。第 3 章 指令系統及匯編語言程序設計【例3.2】 7段LED顯示碼按照09的順序放在以TAB標識的表首地址的數據表中,對每個要顯示的十進制數碼,就用其單字節BCD碼作為偏移量,加上表首地址,就可得到各個數碼的顯示碼。解解:設要顯示的數碼6的BCD碼已經放在內部

37、RAM的60H單元,7段顯示碼放在程序中以TAB標號的表中。以下程序段執行查表操作,將待顯示的數據的7段顯示碼從字型碼表中查出,并存放在63H單元。第 3 章 指令系統及匯編語言程序設計MOV DPTR,#TABMOV A,60HMOVC A,A+DPTRMOV 63H,ATAB:DB xxH,xxH,以程序計數器PC作為基址寄存器有很大的局限性,由于執行到該語句時,PC值已定,查表范圍只能由累加器A的內容決定,所以表格只能存放在以PC當前值為起始地址的256字節單元范圍內。一旦這條指令與表格之間的語句發生變化,則累加器A中的內容也要相應地變化才行,否則就會發生查表錯誤。第 3 章 指令系統及

38、匯編語言程序設計4數據交換指令數據交換指令數據傳送類指令一般用來將操作數自源地址傳送到目的地址,指令執行后,源地址的操作數不變,目的地址的操作數則修改為源地址的操作數,如表3.6所示。數據交換指令使數據作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執行后雙方的操作數都已修改為對方的操作數。因此,兩操作數均未沖掉、丟失。第 3 章 指令系統及匯編語言程序設計表表3.6 數據交換指令數據交換指令匯 編 指 令 操 作 XCH A,direct (A)(direct) XCH A,Ri (A)(Ri) XCH A,Rn (A)(Rn) XCHD A,Ri (A)30(Ri)30 SWAP A

39、(A)74(A)30 第 3 章 指令系統及匯編語言程序設計上述指令前3條是字節交換指令,表明累加器A的內容可以和內部RAM區中任何一個單元的內容進行交換。第4條是半字節交換指令,指令執行后,只將A的低4位和Ri地址單元的低4位交換,而各自的高4位內容保持不變。第5條指令是把累加器A的低半字節與高半字節進行交換。有了交換指令,多數據傳送變得更為高效、快捷,且不會丟失信息。第 3 章 指令系統及匯編語言程序設計例如,設(R0)=30H,(30H)=4AH,(A)=28H,則:執行“XCFA,R0”,結果為(A)=4AH,(30H)=28H;執行“XCHDA,R0”,結果為(A)=2AH,(30H

40、)=48H;執行“SWAP A”,結果為(A)=82H。5堆棧操作指令堆棧操作指令前已敘述,堆棧是用戶自己設定的內部RAM中的一塊專用存儲區,按照“先進后出”規律存取數據,使用時一定先設堆棧指針,堆棧指針缺省為SP=07H。堆棧操作指令用于對堆棧執行數據傳送,共有兩條指令,如表3.7所示。 第 3 章 指令系統及匯編語言程序設計表表3.7 堆棧操作指令堆棧操作指令 匯 編 指 令 操 作 PUSH direct; (SP) ? (SP)+1;(SP)? (direct) POP direct; (direct) ? (SP);(SP)? (SP)-1 第 3 章 指令系統及匯編語言程序設計PU

41、SH指令是入棧指令,也稱為壓棧指令,用來將direct地址中的操作數傳送到堆棧中。CPU執行指令時分兩步:第一步先將SP中的棧頂地址加1,指向一個空的堆棧單元作為新的棧頂;第二步將direct單元中的數據送入該空的棧頂單元。POP指令是出棧指令,也稱為彈出指令,用來將堆棧中的操作數傳送到direct單元。執行該指令時同樣是兩步:第一步先將當前SP所指棧頂單元中的數據送到direct所指單元中;第二步則是將SP中的地址減1,(SP)-1成為當前的新的棧頂單元。堆棧操作指令不影響標志位,主要應用于中斷服務程序中臨時保護數據、保護現場和恢復現場,即執行中斷服務之前,先將必要的單元數據壓入堆棧保存,執

42、行完后,再將數據彈出。第 3 章 指令系統及匯編語言程序設計【例 3.3】 MOV SP,#50H ;以 50H 單元作為棧頂地址 INT0: ;中斷服務子程序 PUSH ACC PUSH B POP B POP ACC RETI 入棧操作 出棧操作 第 3 章 指令系統及匯編語言程序設計上述程序段中,給SP賦值50H作為棧頂地址,在INT0子程序中,先將累加器A、B寄存器的數據入棧,放置時SP指針先加1,指向51H單元,將A中的數據放入,然后SP加1,指向52H,將B中的數據放入。到程序結束時,將壓入堆棧的數據彈出,記住“先進后出,后進先出”原則,先彈出52H的數據到B,然后SP減1,指針指

43、向51H,彈出數據到A,SP再減1。以上指令執行結果不影響程序狀態字寄存器PSW中的標志位。注意注意:堆棧操作指令是直接尋址指令,且必須是字節操作,要特別注意指令的書寫格式。比如,例3.3中累加器用ACC,而工作寄存器R0R7要用直接地址00H07H。第 3 章 指令系統及匯編語言程序設計3.3.2 算術運算類指令算術運算類指令算術運算類指令包含加、減、乘、除以及十進制調整等指令,使51單片機具有較強的運算能力。該類指令大多是雙操作數指令,累加器A總是存放第一源操作數,并作為目的地址存放操作結果。第二操作數可以是立即數,或某工作寄存器Rn、內存單元、間接尋址單元的內容。運算操作將影響標志寄存器

44、PSW中的某些位,如溢出位OV、進位位CY、輔助進位位AC、奇偶標志位P等。程序中監視這些標志位,可方便地進行相關運算操作,如進位標志用于多字節加、減法等,溢出標志用于實現補碼運算,輔助進位用于BCD碼運算等。第 3 章 指令系統及匯編語言程序設計1. 加法類指令加法類指令1) 加法指令加法指令如表3.8所示。第 3 章 指令系統及匯編語言程序設計表表3.8 加加 法法 指指 令令匯 編 指 令 操 作 ADD A,Rn; (A)? (A)+(Rn) ADD A,direct; (A)? (A)+(direct) ADD A,Ri; (A)? (A)+(Ri) ADD A,#data; (A)

45、? (A)+ data 第 3 章 指令系統及匯編語言程序設計參與運算的兩個操作數都是8位二進制數,源地址的操作數和累加器A的操作數相加,和值存放于A中。指令的執行將影響標志寄存器PSW的位AC、CY、OV、P。當和的第3位向第4位有進位(即半字節進位)時,將AC置1;當和的最高位(第7位)有進位時,將CY置1,否則為0;和數中有奇數個1時,P為1;OV位的值則取決于最高位D7是否有進位和次高位D6位是否有進位,即OV=D7D6?!纠?.4】 設(A)=53H,(R5)=FCH,執行“ADD A,R5”后的結果及相關標志位如圖3.6所示。第 3 章 指令系統及匯編語言程序設計圖3.6 例3.4

46、的ADD指令執行示意圖第 3 章 指令系統及匯編語言程序設計標志CY=1,OV= D7D6=0。運算結果是否正確需要考慮將操作數看做無符號數還是符號數。若將操作數視為符號數,則通常采用補碼形式。若將操作數視做無符號數,則根據CY來判斷運算結果是否溢出,若CY=1,表明溢出,有進位;若視為符號數,則根據OV來判斷結果是否溢出,若OV=1,表明溢出,結果錯誤。2) 帶進位的加法指令帶進位的加法指令如表3.9所示。第 3 章 指令系統及匯編語言程序設計表表3.9 帶進位的加法指令帶進位的加法指令匯 編 指 令 操 作 ADDC A,Rn; (A)? (A)+(Rn)+(CY) ADDC A,dire

47、ct; (A)? (A)+(direct)+(CY) ADDC A,Ri; (A)? (A)+(Ri)+(CY) ADDC A,#data; (A)? (A)+ data+(CY) 第 3 章 指令系統及匯編語言程序設計這組指令執行的是將A中的操作數、另一個操作數與CY相加,結果存放于A中。此處的CY是指令執行前的值,而不是指令執行中產生的值。其對標志位的影響與不帶進位加法指令的相同。此種加法指令常用于多字節相加。【例3.5】 (1) 已知(A)=3CH,(R1)=0A9H,CY=1,執行如下指令后,A和CY的值各為多少?ADDC A,R1解解:執行ADDC指令示意圖如圖3.7 所示。第 3

48、章 指令系統及匯編語言程序設計圖3.7 例3.5的ADDC指令執行示意圖第 3 章 指令系統及匯編語言程序設計執行結果:(A)=0E6H,CY=0。(2) 試編程實現3字節無符號數的加法,設被加數的最高位字節的地址已經放在R0中,加數的最高位字節的地址已經放在R1中,加數和被加數都按從高位字節到低位字節的順序放在RAM中,和值存回到被加數的存放處。 第 3 章 指令系統及匯編語言程序設計程序如下:ORG 0200HMOV A,#3 ;取待加的字節數至R2中MOV R2,A ADDA,R0 ;初始化加數及被加數數據指針,使之指向;最低位字節地址MOV R0,AMOV A,R2 ;重新取待加字節數

49、ADDA,R1MOV R1,ACLRC ;清除進位位第 3 章 指令系統及匯編語言程序設計ADD_MULTI: DEC R0 ;(R0)? (R0)-1,調整數據指針 DEC R1 MOV A,R0 ;(A)? (R0) ADDC A,R1 ;(A)? (A)+(R1)+(CY),最低位字節相加 MOV R0,A ;和存回(R0)中 DEC R0 ;(R0)? (R0)-1,調整數據指針 DEC R1 第 3 章 指令系統及匯編語言程序設計MOV A,R0 ;(A)(R0)ADDCA,R1 ;(A)(A)+(R1)+(CY),中間字節相、 ;加MOV R0,A ;和存回(R0)中DECR0 ;

50、(R0)(R0)-1,調整數據指針DECR1MOV A,R0 ;(A)(R0)ADDCA,R1 ;(A)(A)+(R1)+(CY),最高位字節;相加MOV R0,A ;和存回(R0)中END第 3 章 指令系統及匯編語言程序設計3) 加1指令加1指令如表3.10所示。第 3 章 指令系統及匯編語言程序設計表表3.10 加加1指指令令匯 編 指 令 操 作 INC A; (A)? (A)+1 INC Rn; (Rn)? (Rn)+1 INC direct; (direct)? (direct)+1 INC Ri; (Ri)? (Ri)+1 INC DPTR; (DPTR)? (DPTR)+1 第

51、 3 章 指令系統及匯編語言程序設計加1指令使指定單元的內容增加1,只有第1條指令“INC A”能對奇偶標志位P產生影響,其余幾條不會對任何標志位產生影響。第5條指令是對數據指針進行16位加1運算,為地址加1提供了方便?!纠?.6】 設(R0)=70H,(70H)=42H,(71H)=57H,執行如下指令后結果是什么?(1) INC R0(2) INC R0INC R0第 3 章 指令系統及匯編語言程序設計解解:執行后:(1) (R0)+1=(70H)+1=42H+1=43H,即(70H)=43H。(2) (R0)+1=70H+1=71H,即(R0)=71H。(R0)+1=(71H)+1=57

52、H+1=58H,即(71H)=58H。執行結果:(R0)=71H,(70H)=43H,(71H)=58H。由此例可看出,加1指令可以非常靈活地運用于有遞增需要的場合。4) 十進制調整指令十進制調整指令如表3.11所示。第 3 章 指令系統及匯編語言程序設計表表3.11 十進制調整指令十進制調整指令匯 編 指 令 操 作 DA A; 對A 中的 BCD 碼加法結果進行校正 第 3 章 指令系統及匯編語言程序設計當BCD碼按二進制數相加后,需用該指令對結果進行校正,才能得到正確的BCD碼的和值。一個字節可包含兩個BCD碼,稱為壓縮的BCD碼,調整過程如下:若累加器A的低四位字節(A)039或(AC

53、)=1,則(A)03=(A)03+06H;同時,若累加器A的高四位(A)479或(CY)=1,則(A)47=(A)47+60H;十進制調整指令僅對進位位CY產生影響,不影響OV標志。需要注意的是,本指令不能簡單地把累加器A中的十六進制數變換成BCD碼,也不能用于十進制減法的校正。 第 3 章 指令系統及匯編語言程序設計【例3.7】 兩個4位BCD碼相加,設加數、被加數已經按壓縮BCD碼從高位到低位存放在內存單元中,被加數存于RAM的32H、31H,加數存于38H、39H,和存于5EH、5FH,設和不會溢出。第 3 章 指令系統及匯編語言程序設計解解:程序如下:ORG 0100HMOV A,31

54、H ;被加數的BCD碼的低2位送AADD A,39H ;與加數的BCD碼的低2位相加DA A ;作十進制調整MOV 5FH,A ;低2位和值存于5FH第 3 章 指令系統及匯編語言程序設計MOV A,32H ;被加數的高2位送AADDC A,38H ;與加數的高2位相加DA A ;作十進制調整MOV 5EH,A ;高2位和值存于5EHEND2. 減法類指令減法類指令1) 帶借位減法指令帶借位減法指令如表3.12所示。第 3 章 指令系統及匯編語言程序設計表表3.12 帶借位減法指令帶借位減法指令匯 編 指 令 操 作 SUBB A,Rn; (A)? (A)-(Rn)-(CY) SUBB A,d

55、irect; (A)? (A)-(direct)-(CY) SUBB A,Ri; (A)? (A)- (Ri)-(CY) SUBB A,#data; (A)? (A)-data-(CY) 第 3 章 指令系統及匯編語言程序設計帶借位減法指令是從累加器A中減去進位標志CY的值和指定變量的值,結果存放于A中,將影響標志位CY、AC、OV、P。若第7位有借位,則CY=1,否則為0;若第3位有借位,則AC=1,否則為0;若操作數被視為符號數,則當有溢出時,OV=1;減法結果中1的個數為奇數時,P=1?!纠?.8】 設有兩個3字節無符號數相減,按照高位到低位的順序,被減數存于52H、51H、50H,減數

56、存于5AH、59H、58H,差值存于52H、51H、50H。第 3 章 指令系統及匯編語言程序設計解:程序如下: ORG 0030H CLR C ;清零操作,是一條位操作指令,令 CY=0 MOV R0,#50H ;被減數的低 8 位的地址傳給 R0,以 R0 作為被減數的地 ;址指針 MOV R1,#58H ;減數的低 8 位的地址傳給 R1,以 R1 作為減數的地址 指針 ;低 8 位相減 MOV A,R0 ;(A)? (50H) SUBB A,R1 ;低 8 位相減 MOV R0,A ;差值存回 50H INC R0 ;被減數的地址指針 R0 遞增 1 INC R1 ;減數的地址指針 R

57、1 遞增 1 ;中間 8 位相減 第 3 章 指令系統及匯編語言程序設計MOV A,R0SUBB A,R1MOV R0,AINC R0INC R1;高8位相減MOV A,R0SUBB A,R1MOV R0,AEND由此程序段可看出,相同的減法操作執行了3次,采用的是順序執行模式,學習了后面的循環轉移指令后,就可作簡化處理。第 3 章 指令系統及匯編語言程序設計2) 減1指令減1指令如表3.13所示。第 3 章 指令系統及匯編語言程序設計表表3.13 減減1指指令令匯 編 指 令 操 作 DEC A; (A)? (A)-1 DEC Rn; (Rn)? (Rn)-1 DEC direct; (di

58、rect)? (direct)-1 DEC Ri ; (Ri)? (Ri)-1 第 3 章 指令系統及匯編語言程序設計減1指令是將指定的地址或單元中的內容減1,結果仍存放于原單元中,不影響標志位?!纠?.9】 設(A)=0FEH,(R0)=60H,(60H)=0AH,試問下述指令的執行結果是什么?(1) DEC A;(2) DEC R0;(3) DEC R0。解解:執行結果如下:(1) (A)=0FEH-1=0FDH。(2) (60H)=0AH-1=09H。(3) (R0)=60H-1=5FH。3. 乘法指令乘法指令乘法指令如表3.14所示。第 3 章 指令系統及匯編語言程序設計表表3.14

59、乘乘 法法 指指 令令匯 編 指 令 操 作 MUL AB; (B)(高8位)、(A)(低 8位)? (A)(B) 第 3 章 指令系統及匯編語言程序設計乘法指令是將累加器A和寄存器B中的兩個無符號整數相乘,所得積的高8位存于B,低8位存于A。該操作將會對OV、CY和P標志產生影響:當乘積結果大于255(0FFH)時,溢出標志OV=1,否則為0;進位標志CY總是被清零;當累加器A中1的個數為奇數時,奇偶校驗標志位P =1,否則為0。 第 3 章 指令系統及匯編語言程序設計【例3.10】 試編寫程序完成100d55d,將結果存放于60H(高8位)、61H(低8位)。解:ORG 0030HMOV

60、A,#100 ;十進制被乘數賦值給A MOV B,#55 ;十進制乘數賦給B MUL AB ;兩數相乘 MOV 60H,B;積的高8位送RAM的60H MOV 61H,A ;積的低8位送RAM的61H END執行結果:(60H)=15H,(61H)=7CH第 3 章 指令系統及匯編語言程序設計4. 除法指令除法指令除法指令如表3.15所示。第 3 章 指令系統及匯編語言程序設計表表3.15 除除 法法 指指 令令匯 編 指 令 操 作 DIV AB; (B)(余數)、(A)(整數)? (A)(B) 第 3 章 指令系統及匯編語言程序設計除法指令是將累加器A中的8位無符號整數除以寄存器B中的8位

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論