單片機(jī)原理與應(yīng)用(倪云峰)全書(shū)第3章_第1頁(yè)
單片機(jī)原理與應(yīng)用(倪云峰)全書(shū)第3章_第2頁(yè)
單片機(jī)原理與應(yīng)用(倪云峰)全書(shū)第3章_第3頁(yè)
單片機(jī)原理與應(yīng)用(倪云峰)全書(shū)第3章_第4頁(yè)
單片機(jī)原理與應(yīng)用(倪云峰)全書(shū)第3章_第5頁(yè)
已閱讀5頁(yè),還剩243頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)3.1 MCS-51單片機(jī)匯編語(yǔ)言與指令格式3.2 尋址方式3.3 MCS-51單片機(jī)指令系統(tǒng)3.4 匯編語(yǔ)言及匯編語(yǔ)言程序設(shè)計(jì)3.5 基本程序設(shè)計(jì)方法本章小結(jié)習(xí)題 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)3.1.1 單片機(jī)的匯編語(yǔ)言單片機(jī)的匯編語(yǔ)言由于計(jì)算機(jī)只能識(shí)別二進(jìn)制機(jī)器語(yǔ)言代碼,它是一種用二進(jìn)制數(shù)0、1組成的代碼,不易辨識(shí)、記憶和書(shū)寫(xiě),因此難以直接用它來(lái)進(jìn)行程序設(shè)計(jì)。為了既能體現(xiàn)機(jī)器語(yǔ)言的特點(diǎn),又便于人們理解、記憶和書(shū)寫(xiě),計(jì)算機(jī)常采用助記符來(lái)編寫(xiě)指令。助記符是根據(jù)機(jī)器指令的不同功能和操作對(duì)象來(lái)描述指令的,它采用有關(guān)的英文縮寫(xiě)來(lái)描述指令的特征,因此便于

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

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

4、令的二進(jìn)制代碼只有一個(gè)字節(jié)。單字節(jié)指令分為兩類:一類是無(wú)操作數(shù)的單字節(jié)指令,其指令碼只有操作碼字段,操作數(shù)是隱含在操作碼中的;另一類是含有操作數(shù)寄存器編號(hào)的單字節(jié)指令,其指令碼由操作碼字段和用來(lái)指示操作數(shù)所在寄存器號(hào)的地址碼組成。其格式如下:7 0 操作碼 (地址碼) 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)2. 雙字節(jié)指令雙字節(jié)指令 雙字節(jié)指令的二進(jìn)制代碼有兩個(gè)字節(jié):第一個(gè)字節(jié)是操作碼(或操作碼加操作數(shù)所在寄存器的地址碼),第二個(gè)字節(jié)是數(shù)據(jù)或數(shù)據(jù)所在的地址碼。其格式如下: 7 0 第一字節(jié) 操作碼 (地址碼) 第二字節(jié) 數(shù)據(jù)或地址碼 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)3. 三字節(jié)指令三字節(jié)

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

6、含在指令中的16位立即數(shù)。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)(4) rel:相對(duì)地址,以補(bǔ)碼形式表示的地址偏移量,范圍為-128+127,主要用于無(wú)條件相對(duì)短轉(zhuǎn)移指令SJMP和所有的條件轉(zhuǎn)移指令中。(5) addr16:16位目的地址。目的地址可在全部程序存儲(chǔ)器的64 KB空間范圍內(nèi),主要用于無(wú)條件長(zhǎng)轉(zhuǎn)移指令LJMP和子程序長(zhǎng)調(diào)用指令LCALL中。(6) addr11:11位目的地址。目的地址應(yīng)與下一條指令處于相同的2 KB程序存儲(chǔ)器地址空間范圍內(nèi),主要用于絕對(duì)轉(zhuǎn)移指令A(yù)JMP和子程序絕對(duì)調(diào)用指令A(yù)CALL中。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)(7) direct:表示直接尋址的地址,

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

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

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

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

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

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

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

14、列,片內(nèi)RAM有256B單元,其高128B單元與SFR的地址是重疊的。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)為避免混淆,單片機(jī)規(guī)定:直接尋址的指令不能訪問(wèn)片內(nèi)RAM的高128B單元(80HFFH)。若要訪問(wèn)這些單元,則只能用寄存器間接尋址指令,而要訪問(wèn)SFR只能用直接尋址指令。另外,訪問(wèn)SFR可在指令中直接使用該寄存器的名字來(lái)代替地址,如“MOV A,80H”可以寫(xiě)成“MOV A,P0”,因?yàn)镻0口的地址為80H。直接尋址還可直接訪問(wèn)片內(nèi)221個(gè)位地址空間。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)直接尋址訪問(wèn)程序存儲(chǔ)器的有長(zhǎng)轉(zhuǎn)移指令LJMP addr16、絕對(duì)轉(zhuǎn)移指令A(yù)JMP addr11、長(zhǎng)調(diào)

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

16、C A,A+PC ;A(PC)+()A中為無(wú)符號(hào)數(shù),指令功能是把A的內(nèi)容和DPTR的內(nèi)容或當(dāng)前PC的內(nèi)容相加得到程序存儲(chǔ)器的有效地址,把該存儲(chǔ)器單元中的內(nèi)容送到A?!癕OVC A,A+DPTR”的指令碼是93H,尋址過(guò)程如圖3.4所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)圖3.4 基址寄存器加變址寄存器間接尋址示意圖第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)3.2.6 相對(duì)尋址相對(duì)尋址程序的執(zhí)行中往往有相對(duì)轉(zhuǎn)移的需要,即以當(dāng)前指令的位置(PC值)為基準(zhǔn)點(diǎn),加上指令中給出的相對(duì)偏移量(rel)來(lái)獲得操作數(shù)所在的實(shí)際地址。這類尋址方式稱為相對(duì)尋址,是轉(zhuǎn)移指令中用到的尋址方式。偏移量rel是符號(hào)數(shù),在

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

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

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

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

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

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

23、數(shù)、源操作數(shù)、功能注釋,以下類同,不再說(shuō)明。操作碼助記符 目的操作數(shù) 源操作數(shù) 功能注釋 操作碼助記符 目的操作數(shù) 源操作數(shù) 功能注釋 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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)這組指令表明,8位立即數(shù)可以直接傳送到內(nèi)部數(shù)據(jù)區(qū)RAM的各個(gè)位置,并且可把16位立即數(shù)直接裝入數(shù)據(jù)指針DPTR。其他相關(guān)指令的功

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

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

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

27、,第二字節(jié)為高8位立即數(shù),第三字節(jié)為低8位立即數(shù)。例如,“MOV DPTR,#5534H”指令執(zhí)行后,DPTR寄存器的高8位寄存器DPH的內(nèi)容為55H,低8位寄存器DPL的內(nèi)容為34H。該指令的機(jī)器代碼為90H 55H 34H。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)2) 寄存器尋址在該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有以下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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)這組指令的

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

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

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

31、FH)和高128B單元(80HFFH,對(duì)52子系列),但不能用于尋址特殊功能寄存器SFR。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)例如:設(shè)內(nèi)部RAM(30H)=40H,(40H)=10H,(10H)=00H,端口(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、P2口的內(nèi)容。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 執(zhí)行上述指令后結(jié)果為:(R0)=30H,(R1)

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

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

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

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

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

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

38、匯編語(yǔ)言程序設(shè)計(jì)4數(shù)據(jù)交換指令數(shù)據(jù)交換指令數(shù)據(jù)傳送類指令一般用來(lái)將操作數(shù)自源地址傳送到目的地址,指令執(zhí)行后,源地址的操作數(shù)不變,目的地址的操作數(shù)則修改為源地址的操作數(shù),如表3.6所示。數(shù)據(jù)交換指令使數(shù)據(jù)作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后雙方的操作數(shù)都已修改為對(duì)方的操作數(shù)。因此,兩操作數(shù)均未沖掉、丟失。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表3.6 數(shù)據(jù)交換指令數(shù)據(jù)交換指令匯 編 指 令 操 作 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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)上述指令前3條是字節(jié)交換指令,表明累加器A的內(nèi)容可以和內(nèi)部RAM區(qū)中任何一個(gè)單元的內(nèi)容進(jìn)行交換。第4條是半字節(jié)交換指令,指令執(zhí)行后,只將A的低4位和Ri地址單元的低4位交換,而各自的高4位內(nèi)容保持不變。第5條指令是把累加器A的低半字節(jié)與高半字節(jié)進(jìn)行交換。有了交換指令,多數(shù)據(jù)傳送變得更為高效、快捷,且不會(huì)丟失信息。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)例如,設(shè)(R0)=30H,(30H)=4AH,(A)=28H,則:執(zhí)行“XCFA,R0”,結(jié)果為(A)=4AH,(30H)=28H;執(zhí)行“XCHDA,R0”,結(jié)果為(A)=2AH,(30H

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

41、SH指令是入棧指令,也稱為壓棧指令,用來(lái)將direct地址中的操作數(shù)傳送到堆棧中。CPU執(zhí)行指令時(shí)分兩步:第一步先將SP中的棧頂?shù)刂芳?,指向一個(gè)空的堆棧單元作為新的棧頂;第二步將direct單元中的數(shù)據(jù)送入該空的棧頂單元。POP指令是出棧指令,也稱為彈出指令,用來(lái)將堆棧中的操作數(shù)傳送到direct單元。執(zhí)行該指令時(shí)同樣是兩步:第一步先將當(dāng)前SP所指棧頂單元中的數(shù)據(jù)送到direct所指單元中;第二步則是將SP中的地址減1,(SP)-1成為當(dāng)前的新的棧頂單元。堆棧操作指令不影響標(biāo)志位,主要應(yīng)用于中斷服務(wù)程序中臨時(shí)保護(hù)數(shù)據(jù)、保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng),即執(zhí)行中斷服務(wù)之前,先將必要的單元數(shù)據(jù)壓入堆棧保存,執(zhí)

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

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

44、PSW中的某些位,如溢出位OV、進(jìn)位位CY、輔助進(jìn)位位AC、奇偶標(biāo)志位P等。程序中監(jiān)視這些標(biāo)志位,可方便地進(jìn)行相關(guān)運(yùn)算操作,如進(jìn)位標(biāo)志用于多字節(jié)加、減法等,溢出標(biāo)志用于實(shí)現(xiàn)補(bǔ)碼運(yùn)算,輔助進(jìn)位用于BCD碼運(yùn)算等。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)1. 加法類指令加法類指令1) 加法指令加法指令如表3.8所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)參與運(yùn)算的兩個(gè)操作數(shù)都是8位二進(jìn)制數(shù),源地址的操作數(shù)和累加器A的操作數(shù)相加,和值存放于A中。指令的執(zhí)行將影響標(biāo)志寄存器PSW的位AC、CY、OV、P。當(dāng)和的第3位向第4位有進(jìn)位(即半字節(jié)進(jìn)位)時(shí),將AC置1;當(dāng)和的最高位(第7位)有進(jìn)位時(shí),將CY置1,否則為0;和數(shù)中有奇數(shù)個(gè)1時(shí),P為1;OV位的值則取決于最高位D7是否有進(jìn)位和次高位D6位是否有進(jìn)位,即OV=D7D6?!纠?.4】 設(shè)(A)=53H,(R5)=FCH,執(zhí)行“ADD A,R5”后的結(jié)果及相關(guān)標(biāo)志位如圖3.6所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)圖3.6 例3.4

46、的ADD指令執(zhí)行示意圖第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)標(biāo)志CY=1,OV= D7D6=0。運(yùn)算結(jié)果是否正確需要考慮將操作數(shù)看做無(wú)符號(hào)數(shù)還是符號(hào)數(shù)。若將操作數(shù)視為符號(hào)數(shù),則通常采用補(bǔ)碼形式。若將操作數(shù)視做無(wú)符號(hào)數(shù),則根據(jù)CY來(lái)判斷運(yùn)算結(jié)果是否溢出,若CY=1,表明溢出,有進(jìn)位;若視為符號(hào)數(shù),則根據(jù)OV來(lái)判斷結(jié)果是否溢出,若OV=1,表明溢出,結(jié)果錯(cuò)誤。2) 帶進(jìn)位的加法指令帶進(jìn)位的加法指令如表3.9所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表3.9 帶進(jìn)位的加法指令帶進(jìn)位的加法指令匯 編 指 令 操 作 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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)這組指令執(zhí)行的是將A中的操作數(shù)、另一個(gè)操作數(shù)與CY相加,結(jié)果存放于A中。此處的CY是指令執(zhí)行前的值,而不是指令執(zhí)行中產(chǎn)生的值。其對(duì)標(biāo)志位的影響與不帶進(jìn)位加法指令的相同。此種加法指令常用于多字節(jié)相加?!纠?.5】 (1) 已知(A)=3CH,(R1)=0A9H,CY=1,執(zhí)行如下指令后,A和CY的值各為多少?ADDC A,R1解解:執(zhí)行ADDC指令示意圖如圖3.7 所示。第 3

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

49、ADDA,R1MOV R1,ACLRC ;清除進(jìn)位位第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)ADD_MULTI: DEC R0 ;(R0)? (R0)-1,調(diào)整數(shù)據(jù)指針 DEC R1 MOV A,R0 ;(A)? (R0) ADDC A,R1 ;(A)? (A)+(R1)+(CY),最低位字節(jié)相加 MOV R0,A ;和存回(R0)中 DEC R0 ;(R0)? (R0)-1,調(diào)整數(shù)據(jù)指針 DEC R1 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)MOV A,R0 ;(A)(R0)ADDCA,R1 ;(A)(A)+(R1)+(CY),中間字節(jié)相、 ;加MOV R0,A ;和存回(R0)中DECR0 ;

50、(R0)(R0)-1,調(diào)整數(shù)據(jù)指針DECR1MOV A,R0 ;(A)(R0)ADDCA,R1 ;(A)(A)+(R1)+(CY),最高位字節(jié);相加MOV R0,A ;和存回(R0)中END第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)3) 加1指令加1指令如表3.10所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)加1指令使指定單元的內(nèi)容增加1,只有第1條指令“INC A”能對(duì)奇偶標(biāo)志位P產(chǎn)生影響,其余幾條不會(huì)對(duì)任何標(biāo)志位產(chǎn)生影響。第5條指令是對(duì)數(shù)據(jù)指針進(jìn)行16位加1運(yùn)算,為地址加1提供了方便?!纠?.6】 設(shè)(R0)=70H,(70H)=42H,(71H)=57H,執(zhí)行如下指令后結(jié)果是什么?(1) INC R0(2) INC R0INC R0第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)解解:執(zhí)行后:(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。執(zhí)行結(jié)果:(R0)=71H,(70H)=43H,(71H)=58H。由此例可看出,加1指令可以非常靈活地運(yùn)用于有遞增需要的場(chǎng)合。4) 十進(jìn)制調(diào)整指令十進(jìn)制調(diào)整指令如表3.11所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表3.11 十進(jìn)制調(diào)整指令十進(jìn)制調(diào)整指令匯 編 指 令 操 作 DA A; 對(duì)A 中的 BCD 碼加法結(jié)果進(jìn)行校正 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)當(dāng)BCD碼按二進(jìn)制數(shù)相加后,需用該指令對(duì)結(jié)果進(jìn)行校正,才能得到正確的BCD碼的和值。一個(gè)字節(jié)可包含兩個(gè)BCD碼,稱為壓縮的BCD碼,調(diào)整過(guò)程如下:若累加器A的低四位字節(jié)(A)039或(AC

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

54、H ;被加數(shù)的BCD碼的低2位送AADD A,39H ;與加數(shù)的BCD碼的低2位相加DA A ;作十進(jìn)制調(diào)整MOV 5FH,A ;低2位和值存于5FH第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)MOV A,32H ;被加數(shù)的高2位送AADDC A,38H ;與加數(shù)的高2位相加DA A ;作十進(jìn)制調(diào)整MOV 5EH,A ;高2位和值存于5EHEND2. 減法類指令減法類指令1) 帶借位減法指令帶借位減法指令如表3.12所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)帶借位減法指令是從累加器A中減去進(jìn)位標(biāo)志CY的值和指定變量的值,結(jié)果存放于A中,將影響標(biāo)志位CY、AC、OV、P。若第7位有借位,則CY=1,否則為0;若第3位有借位,則AC=1,否則為0;若操作數(shù)被視為符號(hào)數(shù),則當(dāng)有溢出時(shí),OV=1;減法結(jié)果中1的個(gè)數(shù)為奇數(shù)時(shí),P=1?!纠?.8】 設(shè)有兩個(gè)3字節(jié)無(wú)符號(hào)數(shù)相減,按照高位到低位的順序,被減數(shù)存于52H、51H、50H,減數(shù)

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

57、1 遞增 1 ;中間 8 位相減 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)MOV A,R0SUBB A,R1MOV R0,AINC R0INC R1;高8位相減MOV A,R0SUBB A,R1MOV R0,AEND由此程序段可看出,相同的減法操作執(zhí)行了3次,采用的是順序執(zhí)行模式,學(xué)習(xí)了后面的循環(huán)轉(zhuǎn)移指令后,就可作簡(jiǎn)化處理。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)2) 減1指令減1指令如表3.13所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表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 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)減1指令是將指定的地址或單元中的內(nèi)容減1,結(jié)果仍存放于原單元中,不影響標(biāo)志位?!纠?.9】 設(shè)(A)=0FEH,(R0)=60H,(60H)=0AH,試問(wèn)下述指令的執(zhí)行結(jié)果是什么?(1) DEC A;(2) DEC R0;(3) DEC R0。解解:執(zhí)行結(jié)果如下:(1) (A)=0FEH-1=0FDH。(2) (60H)=0AH-1=09H。(3) (R0)=60H-1=5FH。3. 乘法指令乘法指令乘法指令如表3.14所示。第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)表表3.14

59、乘乘 法法 指指 令令匯 編 指 令 操 作 MUL AB; (B)(高8位)、(A)(低 8位)? (A)(B) 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)乘法指令是將累加器A和寄存器B中的兩個(gè)無(wú)符號(hào)整數(shù)相乘,所得積的高8位存于B,低8位存于A。該操作將會(huì)對(duì)OV、CY和P標(biāo)志產(chǎn)生影響:當(dāng)乘積結(jié)果大于255(0FFH)時(shí),溢出標(biāo)志OV=1,否則為0;進(jìn)位標(biāo)志CY總是被清零;當(dāng)累加器A中1的個(gè)數(shù)為奇數(shù)時(shí),奇偶校驗(yàn)標(biāo)志位P =1,否則為0。 第 3 章 指令系統(tǒng)及匯編語(yǔ)言程序設(shè)計(jì)【例3.10】 試編寫(xiě)程序完成100d55d,將結(jié)果存放于60H(高8位)、61H(低8位)。解:ORG 0030HMOV

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論