版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計第第3 3章章 MCS-51MCS-51指令系統(tǒng)指令系統(tǒng) 和匯編語言程序設(shè)計3.1 概述概述3.2 尋址方式尋址方式3.3 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令3.4 算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令3.5 邏輯運(yùn)算及移位指令邏輯運(yùn)算及移位指令3.6 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令3.7 子程序調(diào)用與返回指令子程序調(diào)用與返回指令3.8 位操作類指令位操作類指令3.9 匯編程序格式與偽指令匯編程序格式與偽指令3.10 匯編程序設(shè)計示例匯編程序設(shè)計示例第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.1 概述概述3.1.1 指令、指令系統(tǒng)的概念指令、指令系統(tǒng)的概念指
2、令指令是使計算機(jī)內(nèi)部執(zhí)行的一種操作,提供給用戶編程使用的一種命令。機(jī)器語言機(jī)器語言以二進(jìn)制代碼來描述指令功能的語言。匯編語言匯編語言由于機(jī)器語言不便被人們識別、記憶、理解和使用,因此給每條機(jī)器語言指令賦予助記符號來表示,這就形成了匯編語言,便于人們識別、記憶、理解和使用的一種指令形式,它和機(jī)器語言指令一一對應(yīng),也是由計算機(jī)的硬件特性所決定的。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計指令的結(jié)構(gòu):指令的結(jié)構(gòu): 兩個基本部分 操作碼操作碼 + 操作數(shù)操作數(shù)操作碼操作碼:表明指令要執(zhí)行的操作性質(zhì)操作數(shù):操作數(shù):說明參與操作的數(shù)據(jù)或數(shù)據(jù)所存放的地址第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計指令
3、三種屬性:指令三種屬性:功能、時間和空間。功能功能屬性是指每條指令都對應(yīng)一個特定的操作功能;時間時間屬性是指一條指令執(zhí)行所用的時間,一般用機(jī)器周期來表示;空間空間屬性是指一條指令在程序存儲器中存儲所占用的字節(jié)數(shù)。 功能功能屬性最為重要,但在一些實(shí)時控制應(yīng)用程序中,有時需要計算一個程序段的確切執(zhí)行時間或編寫軟件延時程序,都要用到每條指令的時間時間屬性;在程序存儲器的空間設(shè)計,或相對轉(zhuǎn)移指令的偏移量計算時就要用到指令的空間空間屬性。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計三種格式三種格式:單字節(jié)指令、雙字節(jié)指令、三字節(jié)指令單字節(jié)指令單字節(jié)指令: 1)8位編碼全為操作碼:如:NOP (0000
4、0000) 2)8位編碼包括操作碼和寄存器編碼: 如: MOV A,Rn (11101 Rn )雙字節(jié)指令雙字節(jié)指令: 指令編碼由兩個字組成,占用兩個存儲單元 如: MOV A,#DATA三字節(jié)指令三字節(jié)指令: 第一個字節(jié)為操作碼,后兩個字節(jié)為操作數(shù) 如: MOV direct,#DATA第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.1.2 MCS-51單片機(jī)指令系統(tǒng)及其指令格式單片機(jī)指令系統(tǒng)及其指令格式 MCS-51單片機(jī)指令系統(tǒng)共有111條指令。從功能上可劃分成五大類從功能上可劃分成五大類: 數(shù)據(jù)傳送、算術(shù)操作、邏輯操作、程序轉(zhuǎn)移、位操作等從空間屬性上分為從空間屬性上分為:單字節(jié)指令(
5、49條)、雙字節(jié)指令(46條)和最長的三字節(jié)指令(只有16條)。從時間屬性上可分成從時間屬性上可分成:單機(jī)器周期指令(64條)、雙機(jī)器周期指令(45條)和4個機(jī)器周期的指令(只有乘、除法兩條)第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計匯編語言指令格式如下匯編語言指令格式如下: 標(biāo)號: 操作碼助記符 目的操作數(shù),源操作數(shù) ;注釋第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 為便于后面的學(xué)習(xí),在這里先對描述指令的一些符號的約定意義作以說明: (1) Ri和和Rn:表示當(dāng)前工作寄存器區(qū)中的工作寄存器, i取0或1,表示R0或R1。n取07,表示R0R7。 (2) #data:表示包含在指令中的
6、8位立即數(shù)。 (3) #data16:表示包含在指令中的16位立即數(shù)。 (4) rel:以補(bǔ)碼形式表示的8位相對偏移量,范圍為 -128127,主要用在相對尋址的指令中。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 (5) addr16和和addr11:分別表示16位直接地址和11位直接地址。 (6) direct:表示直接尋址的地址。 (7) bit:表示可位尋址的直接位地址。 (8) (X):表示X單元中的內(nèi)容。 (9) (X):表示以X單元的內(nèi)容為地址的存儲器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用(X)表示。 (10) / 和和符號符號:“/”表示對該位操作數(shù)取反,但不影響該位的
7、原值?!啊北硎静僮髁鞒?,將箭尾一方的內(nèi)容送入箭頭所指另一方的單元中去。 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 立即尋址 寄存器尋址 寄存器間接尋址 直接尋址 變址尋址(基址寄存器加變址寄存器間接尋址) 相對尋址 位尋址3.2 尋尋 址址 方方 式式第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.1 立即尋址立即尋址 操作數(shù)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲器中,可以立即得到并執(zhí)行,不需要經(jīng)過別的途徑去尋找。匯編指令中,在一個數(shù)的前面冠以#符號作前綴,就表示該數(shù)為立即尋址立即尋址。 例如:MOVA,#30H 這一條指令的功能是執(zhí)行將立
8、即數(shù)30H傳送到累加器A中的操作。該指令操作碼的機(jī)器代碼為74H,占用一個字節(jié)存儲單元,立即數(shù)30H存放在緊跟在其后的一個字節(jié)存儲單元,成為指令代碼的一部分。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.2 寄存器尋址寄存器尋址 在指令選定的某寄存器中存放或讀取操作數(shù),以完成指令規(guī)定的操作,稱為寄存器尋址寄存器尋址。 例如:MOVA,R0 指令中源操作數(shù)和目的操作數(shù)都是寄存器尋址。 寄存器尋址按所選定的工作寄存器R0R7進(jìn)行操作,指令機(jī)器碼的低3位的八種組合000,001,110,111分別指明所用的工作寄存器R0,R1,R6,R7。如:MOV A,Rn(n=07),這8條指令對應(yīng)的機(jī)
9、器碼分別為E8HEFH。 在匯編指令中,累加器A作為寄存器尋址的操作數(shù),但在機(jī)器碼中無需指明,它由操作碼隱含。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.3 寄存器間接尋址寄存器間接尋址 由指令指出某一寄存器的內(nèi)容作為操作數(shù)地址的尋址方法,稱為寄存器間接尋址寄存器間接尋址。寄存器起地址指針的作用。 例如:MOV A,R1 指令的源操作數(shù)是寄存器間接尋址。該指令的功能是將以工作寄存器R1中的內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到A中去。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計圖3.1 寄存器間接尋址示意圖 例如:若R1中的內(nèi)容為80H,片內(nèi)RAM地址為80H的單元中的內(nèi)容為2FH
10、,則執(zhí)行該指令后,片內(nèi)RAM 80H單元的內(nèi)容2FH被送到A中。寄存器間接尋址示意圖如圖3.1所示。 MOV A,R1第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.4 直接尋址直接尋址 指令中直接給出操作數(shù)所在的存儲器地址,以供取數(shù)或存數(shù)的尋址方式稱為直接尋址直接尋址。 例如:MOV A,40H 指令中的源操作數(shù)就是直接尋址,40H為操作數(shù)的地址。 直接尋址可用于訪問片內(nèi)、外數(shù)據(jù)存儲器,也可用于訪問程序存儲器。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計說明:說明: 直接尋址可訪問片內(nèi)RAM的低128個單元(00H7FH),同時也是用于訪問高128個單元的特殊功能寄存器SFR的唯一方
11、法。由于52子系列的片內(nèi)RAM有256個單元,其高128個單元與SFR的地址是重疊的。 為了避免混亂,單片機(jī)規(guī)定單片機(jī)規(guī)定:直接尋址的指令不能訪問片內(nèi)RAM的高128個單元(80HFFH),若要訪問這些單元只能用寄存器間接尋址指令。 訪問SFR可在指令中直接使用該寄存器的名字來代替地址,如MOV A,80H,可以寫成MOV A,P0。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.5 變址尋址變址尋址(基址寄存器加變址寄存器間接尋址) 用于訪問程序存儲器的數(shù)據(jù)表格用于訪問程序存儲器的數(shù)據(jù)表格 如: MOVC A,A+DPTR MOVC A,A+PC圖3.2 變址尋址示意圖 第3章 MCS
12、-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.6 相對尋址相對尋址 相對尋址相對尋址是以當(dāng)前程序計數(shù)器PC值加上指令中給出的偏移量rel,而構(gòu)成實(shí)際操作數(shù)地址的尋址方法。它用于訪問程序存儲器,常出現(xiàn)在相對轉(zhuǎn)移指令中。 在使用相對尋址時要注意以下兩點(diǎn)在使用相對尋址時要注意以下兩點(diǎn): (1) 當(dāng)前PC值是指相對轉(zhuǎn)移指令的存儲地址加上該指令的字節(jié)數(shù)。 例如:JZ rel 是一條累加器A為零就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲地址為2050H,則執(zhí)行該指令時的當(dāng)前PC值即為2052H。即當(dāng)前PC值是對相對轉(zhuǎn)移指令取指結(jié)束時的值。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 (2) 偏移量rel是有符號的單字
13、節(jié)數(shù)。以補(bǔ)碼表示,其值的范圍是-128+127(00HFFH),負(fù)數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。所以,相對轉(zhuǎn)移指令滿足條件后,轉(zhuǎn)移的地址(目的地址)為: 目的地址=當(dāng)前PC值+rel = 指令存儲地址+指令字節(jié)數(shù)+rel第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.2.7 位尋址位尋址 位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對片內(nèi)RAM中的128位和特殊功能寄存器SFR中的93位進(jìn)行尋址。 如: SETB 55H第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.3 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.3.1 訪問
14、片內(nèi)數(shù)據(jù)存儲器的一般數(shù)據(jù)傳送指令訪問片內(nèi)數(shù)據(jù)存儲器的一般數(shù)據(jù)傳送指令 該類指令的功能是實(shí)現(xiàn)數(shù)在片內(nèi)RAM單元之間、寄存器之間、寄存器與RAM單元之間的傳送。所有指令具有統(tǒng)一的格式,其格式如下: MOV ,;目的操作數(shù)單元源操作數(shù)(或單元) 操作碼助記符都是MOV,目的操作數(shù)和源操作數(shù)不同尋址方式的組合就派生出該類的全部指令。因此,記憶這類指令的關(guān)鍵在于掌握兩個操作數(shù)的各種尋址方式的組合關(guān)系。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計表表3.1 訪問片內(nèi)訪問片內(nèi)RAM的一般傳送指令表的一般傳送指令表第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計
15、例1 設(shè)內(nèi)部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、P2口的內(nèi)容。MOV R0,#30H;(R0)30HMOV 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,#20H;(10H)20H 執(zhí)行上述指令后的結(jié)果為:(R0)=30H,(R1)=(A)=40H,(B)=10H,(40H)=(P1)=(P2)=CAH,(10H)=20H。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.3.2 片內(nèi)
16、特殊傳送指令片內(nèi)特殊傳送指令 1堆棧操作指令堆棧操作指令 堆棧操作有進(jìn)棧和出棧,即壓入和彈出數(shù)據(jù),常用于保存或恢復(fù)現(xiàn)場。進(jìn)棧指令用于保存片內(nèi)RAM單元(低128字節(jié))或特殊功能寄存器SFR的內(nèi)容;出棧指令用于恢復(fù)片內(nèi)RAM單元(低128字節(jié))或特殊功能寄存器SFR的內(nèi)容。 該類指令共有如下兩條指令:第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計(SP)(SP)-1 修改指針,指向新棧頂 (direct)(SP)+ 1) 把棧頂?shù)臄?shù)據(jù)彈出到直接尋址單元中去 PUSH direct ;POP direct ;(SP)direct 把直接地址單元的內(nèi)容壓入SP所指單元內(nèi) (SP)(SP)+ 1 修改
17、指針,使其指向棧頂上的一個存數(shù)單元 這兩條指令都是雙字節(jié)指令,機(jī)器碼分別為:C0 direct 和D0 direct。 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例2 若在外部程序存儲器中2000H單元開始依次存放09的平方值,數(shù)據(jù)指針(DPTR)=3A00H,用查表指令取得2003H單元的數(shù)據(jù)后,要求保持DPTR中的內(nèi)容不變。完成上述功能的程序如下:MOV A,#03H;(A)03HPUSH DPH;保護(hù)DPTR高8位入棧PUSH DPL;保護(hù)DPTR低8位入棧MOV DPTR,#2000H;(DPTR)2000HMOVC A,A+DPTR;(A)(2000H+03H)POP DPL
18、;彈出DPTR低位POP DPH ;彈出DPTR高位執(zhí)行結(jié)果:(A)09H,(DPTR)=3A00H。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 2數(shù)據(jù)交換指令數(shù)據(jù)交換指令 數(shù)據(jù)傳送指令一般都是將操作數(shù)自源地址單元傳送到目的地址單元,指令執(zhí)行后,源地址單元的操作數(shù)不變,目的地址單元的操作數(shù)則修改為源地址單元的操作數(shù)。交換指令數(shù)據(jù)作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后每方的操作數(shù)都修改為另一方的操作數(shù)。因此,兩操作數(shù)均未沖掉、丟失。數(shù)據(jù)交換指令共有如下5條指令:第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計例例3 設(shè)(R0)
19、= 30H,30H = 4AH,(A) = 28H,則執(zhí)行XCH A, R0后,結(jié)果為(A) = 4AH,(30H) = 28H。執(zhí)行XCHD A,R0后,結(jié)果為(A) = 2AH,(30H) = 48H。執(zhí)行SWAP A后,結(jié)果為(A) = 82H。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.3.3 片外數(shù)據(jù)存儲器數(shù)據(jù)傳送指令片外數(shù)據(jù)存儲器數(shù)據(jù)傳送指令 MCS-51單片機(jī)CPU對片外擴(kuò)展的數(shù)據(jù)存儲器RAM或I/O口進(jìn)行數(shù)據(jù)傳送,必須采用寄存器間接尋址的方法,通過累加器A來完成。這類指令共有以下條單字節(jié)指令,指令操作碼助記符都為MOVX。指令助記符 操作功能注釋 機(jī)器碼(H)MOVX A
20、,DPTR ; (A)(DPTR) E6MOVX A,Ri ; (A)(Ri) E2、E3MOVX DPTR ,A ; (DPTR)(A) F0MOVX Ri,A ; (Ri)(A) F2、F3第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計例例4 設(shè)外部RAM(0203H)= FFH,分析以下指令執(zhí)行后的結(jié)果。MOV DPTR,#0203H ;(DPTR)0203HMOVX A,DPTR ;(A)(DPTR)MOV 30H,A ;(30H)(A)MOV A,#0FH ;(A)0FHMOVX DPTR,A ;(DPTR)(A)執(zhí)行結(jié)果為:(DPTR)=0203H,(30H)=FFH,(0203H
21、)=(A)=0FH。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.3.4 訪問程序存儲器的數(shù)據(jù)傳送指令訪問程序存儲器的數(shù)據(jù)傳送指令 訪問程序存儲器的數(shù)據(jù)傳送指令又稱作查表指令,采用基址寄存器加變址寄存器間接尋址方式,把程序存儲器中存放的表格數(shù)據(jù)讀出,傳送到累加器A。共有如下兩條單字節(jié)指令,指令操作碼助記符為MOVC。指令助記符 操作功能注釋 機(jī)器碼(H)MOVC A, A+DPTR ;(A)(A)+(DPTR) 93MOVC A, A+PC ;(PC)(PC)+1,(A)(A)+(PC) 83第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例5 從片外程序存儲器2000H單元開始存放09的
22、平方值,以PC作為基址寄存器進(jìn)行查表得9的平方值。 設(shè)MOVC指令所在地址(PC)=1FF0H,則偏移量=2000H-(1FF0H+1)=0FH。 相應(yīng)的程序如下:MOV A,#09H ;(A)09HADD A,#0FH ;用加法指令進(jìn)行地址調(diào)整MOVC A,A+PC ;(A)(A)+(PC)+1)執(zhí)行結(jié)果為:(PC)=1FF1H,(A)=51H。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計如果用以DPTR為基址寄存器的查表指令,其程序如下:MOV DPTR, 2000H;置表首地址MOV A, 09HMOVC A, A+DPTR第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.4 算術(shù)運(yùn)算
23、類指令算術(shù)運(yùn)算類指令3.4.1 加、減法指令加、減法指令圖3.4 加減法指令形式結(jié)構(gòu)圖(a) 加減法指令關(guān)系圖;(b) 加1、減1指令關(guān)系圖 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計表表3.2 加減法指令表加減法指令表第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例6 設(shè)(A) = 49H,(R0)=6BH,分析執(zhí)行指令A(yù)DD A,R0后的結(jié)果。 結(jié)果為:(A)=B4H,OV=1,CY=0,AC=1,P=0。 例例7 設(shè)(A)=C3H,數(shù)據(jù)指針低位(DPL)=ABH,CY=1,分析執(zhí)行指令A(yù)DDC A,DPL后的結(jié)果。 結(jié)果為:(A)=6FH,CY=1,AC=0,P=0。 例例8 設(shè)
24、 (A) = 52H,(R0)=B4H,分析執(zhí)行如下指令后的結(jié)果 CLR C ;是位操作指令,是進(jìn)位位清零 SUBB A,R0 結(jié)果為:(A)=9EH,CY=1,AC=1,OV=1,P=1。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例9 設(shè) (R0) = 7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐條執(zhí)行下列指令后各單元的內(nèi)容。INC R0INC R0INC R0 INC DPTRINC DPTRINC DPTR第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.4.2 十進(jìn)制調(diào)整指令十進(jìn)制調(diào)整指令若(A)309或(AC)=1,則(A)30(A)30+
25、06H若(A)749或(CY)=1,則(A)74(A)74+06HDA A ; 若AC=1,CY=1同時發(fā)生,或者高4位雖等于9但低4位修正后有進(jìn)位,則A應(yīng)加66H修正。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例10 對BCD碼加法65 + 58DBH,進(jìn)行十進(jìn)制調(diào)整。 參考程序如下:MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58DA A ;十進(jìn)制調(diào)整第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.4.3 乘、除法指令乘、除法指令MUL AB;(B)(A)(B)158(A)(A)(B)70CY0機(jī)器碼:A4H 乘法指令的功能是把累加器A和寄存器B中的兩
26、個8位無符號數(shù)相乘,將乘積16位數(shù)中的低8位存放在A中,高8位存放在B中。若乘積大于FFH(255),則溢出標(biāo)志OV置1,否則OV清零。乘法指令執(zhí)行后進(jìn)位標(biāo)志CY總是零,即CY=0。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計2除法指令除法指令DIV AB;(A)(A)(B)之商,(B)(A)(B)之余數(shù)(CY)0,(OV)0機(jī)器碼:84H 除法指令的功能是把累加器A中的8位無符號整數(shù)除以寄存器B中的8位無符號整數(shù),所得商存于累加器A中,余數(shù)存于寄存器B中,進(jìn)位標(biāo)志位CY和溢出標(biāo)志位OV均被清零。若B中的內(nèi)容為0時,溢出標(biāo)志OV被置1,即OV=1,而CY仍為0。第3章 MCS-51指令系統(tǒng)和
27、匯編語言程序設(shè)計3.5 邏輯運(yùn)算及移位指令邏輯運(yùn)算及移位指令圖3.5 邏輯指令形式結(jié)構(gòu)圖 (a) 與加、減法指令尋址方式相同的邏輯指令;(b) 與加、減法指令尋址方式不同的邏輯指令第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計表表3.3 邏輯操作指令表邏輯操作指令表第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計表表3.3 邏輯操作指令表邏輯操作指令表第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例12 (P1)=C5H=11000101B,屏蔽P1口高4位而保留低4位。 執(zhí)行指令:ANL P1,#0FH 結(jié)果為:(P1)=05H=00000101B。 第3章 MCS-51指令系統(tǒng)和匯編語言
28、程序設(shè)計 邏輯“或”指令常用來使字節(jié)中某些位置“1”,其它位保持不變。則欲置位的位用1與該位相或,保留不變的位用0 與該位相或。 例例13 若(A)=C0H,(R0)=3FH,(3FH)=0FH, 執(zhí)行指令:ORL A,R0 結(jié)果為:(A)=CFH=11001111B。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 邏輯異或指令常用來使字節(jié)中某些位進(jìn)行取反操作,其它位保持不變。欲某位取反該位與1相異或;欲某位保留則該位與0 相異或。還可利用異或指令對某單元自身異或,以實(shí)現(xiàn)清零操作。 例例14 若(A)=B5H=10110101B,執(zhí)行下列操作: XRL A,#0F0H ; A的高4位取反,低4
29、位保留, (A)=01000101B=45H MOV 30H,A ;(30H)=45H XRL A,30H ;自身異或使A清零第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計用移位指令還可以實(shí)現(xiàn)算術(shù)運(yùn)算,左移一位相當(dāng)于原內(nèi)容乘以2,右移一位相當(dāng)于原內(nèi)容除以2。例例15 設(shè)(A)=5AH=90,且CY=0,則執(zhí)行指令RL A后,(A)=B4H=180。執(zhí)行指令 RR A后,(A)=2DH=45。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.6 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令3.6.1 無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令表3.4 無條件轉(zhuǎn)移指令第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 1LJMP(
30、長轉(zhuǎn)指令長轉(zhuǎn)指令) LJMP指令執(zhí)行后,程序無條件地轉(zhuǎn)向16位目標(biāo)地址(addr16)處執(zhí)行,不影響標(biāo)志位。由于指令中提供16位目標(biāo)地址,所以執(zhí)行這條指令可以使程序從當(dāng)前地址轉(zhuǎn)移到64 KB程序存儲器地址空間的任意地址,故得名為長轉(zhuǎn)移。該指令的缺點(diǎn)是執(zhí)行時間長,字節(jié)多。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 2AJMP(絕對轉(zhuǎn)移指令絕對轉(zhuǎn)移指令) AJMP的機(jī)器碼是由11位直接地址addr11和指令操作碼00001,按下列分布組成的: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 該指令執(zhí)行后,程序轉(zhuǎn)移的目的地址是由AJMP指令所在位置的地址P
31、C值加上該指令字節(jié)數(shù)2,構(gòu)成當(dāng)前PC值。取當(dāng)前PC值的高5位與指令中提供的11位直接地址形成轉(zhuǎn)移的目的地址,即 PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0轉(zhuǎn)移目的地址(PC) 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 3SJMP(相對短轉(zhuǎn)指令相對短轉(zhuǎn)指令) 指令的操作數(shù)rel用8位帶符號數(shù)補(bǔ)碼表示,占指令的一個字節(jié)。因?yàn)?位補(bǔ)碼的取值范圍為-128+127,所以該指令的轉(zhuǎn)移范圍是:相對PC當(dāng)前值向前轉(zhuǎn)128字節(jié),向后轉(zhuǎn)127字節(jié)。即轉(zhuǎn)移目的地址= SJMP指令所在地址+2+rel 如在2100H單元有SJMP指令,若
32、rel = 5AH(正數(shù)),則轉(zhuǎn)移目的地址為215CH(向后轉(zhuǎn));若rel = F0H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為20F2H(向前轉(zhuǎn))。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 4JMP A+DPTR(相對長轉(zhuǎn)移指令相對長轉(zhuǎn)移指令) 它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址,以累加器A的內(nèi)容為相對偏移量,在64 KB范圍內(nèi)無條件轉(zhuǎn)移。該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。例如,當(dāng)DPTR為確定值,根據(jù)A的不同值就可以實(shí)現(xiàn)多分支的轉(zhuǎn)移。該指令在執(zhí)行后不會改變DPTR及A中原來的內(nèi)容。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計例例16 根據(jù)累加器A的值,轉(zhuǎn)不同處理程序的入口。 MOV
33、DPTR,#TABLE ;表首地址送DPTR JMP A+DPTR ;根據(jù)A值轉(zhuǎn)移 TABLE:AJMP TAB1 ;當(dāng)(A)=0時轉(zhuǎn)TAB1執(zhí)行 AJMP TAB2 ;當(dāng)(A)=2時轉(zhuǎn)TAB2執(zhí)行 AJMP TAB3 ;當(dāng)(A)=4時轉(zhuǎn)TAB3執(zhí)行第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.6.2 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令是當(dāng)某種條件滿足時,程序轉(zhuǎn)移執(zhí)行;條件不滿足時,程序仍按原來順序執(zhí)行。轉(zhuǎn)移的條件可以是上一條指令或更前一條指令的執(zhí)行結(jié)果(常體現(xiàn)在標(biāo)志位上),也可以是條件轉(zhuǎn)移指令本身包含的某種運(yùn)算結(jié)果。由于該類指令采用相對尋址,因此程序可在以當(dāng)前PC值為中心的-128+
34、127范圍內(nèi)轉(zhuǎn)移。該類指令共有8條,可以分為累加器判零條件轉(zhuǎn)移指令、比較條件轉(zhuǎn)移指令和減1條件轉(zhuǎn)移指令三類。表3.5中列出了這些指令。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計表表3.5 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 1判零條件轉(zhuǎn)移指令判零條件轉(zhuǎn)移指令 判零條件轉(zhuǎn)移指令以累加器A的內(nèi)容是否為0作為轉(zhuǎn)移的條件。JZ指令是為0轉(zhuǎn)移,不為0則順序執(zhí)行;JNZ指令是不為0轉(zhuǎn)移,為0則順序執(zhí)行。累加器A的內(nèi)容是否為0,是由這條指令以前的其它指令執(zhí)行的結(jié)果決定的,執(zhí)行這條指令不作任何運(yùn)算,也不影響標(biāo)志位。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例17
35、將片外RAM首地址為DATA1的一個數(shù)據(jù)塊轉(zhuǎn)送到片內(nèi)RAM首地址為DATA2的存儲區(qū)中。 外部RAM向內(nèi)部RAM的數(shù)據(jù)轉(zhuǎn)送一定要經(jīng)過累加器A,利用判零條件轉(zhuǎn)移正好可以判別是否要繼續(xù)傳送或者終止。完成數(shù)據(jù)傳送的參考程序如下: MOV R0,#DATA1 ;R0作為外部數(shù)據(jù)塊的地址指針 MOV R1,#DATA1 ;R1作為內(nèi)部數(shù)據(jù)塊的地址指針LOOP:MOVX A,R0 ;取外部RAM數(shù)據(jù)送入AHERE:JZ HERE ;數(shù)據(jù)為零則終止傳送 MOV R1,A ;數(shù)據(jù)傳送至內(nèi)部RAM 單元 INC R0 ;修改指針,指向下一數(shù)據(jù)地址 INC R1 SJMP LOOP ;循環(huán)取數(shù)第3章 MCS-51
36、指令系統(tǒng)和匯編語言程序設(shè)計 2比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令 比較轉(zhuǎn)移指令共有4條。這組指令是先對兩個規(guī)定的操作數(shù)進(jìn)行比較,根據(jù)比較的結(jié)果來決定是否轉(zhuǎn)移。若兩個操作數(shù)相等,則不轉(zhuǎn)移,程序順序執(zhí)行;若兩個操作數(shù)不等,則轉(zhuǎn)移。比較是進(jìn)行一次減法運(yùn)算,但其差值不保存,兩個數(shù)的原值不受影響, 例例18 當(dāng)從P1口輸入數(shù)據(jù)為01H 時,程序繼續(xù)執(zhí)行,否則等待,直到P1口出現(xiàn)01H。參考程序如下: MOV A,#01H ;立即數(shù)01H送AWAIT: CJNE A,P1,WAIT ;(P1)01H,則等待第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 3減減1條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 減1條件轉(zhuǎn)移指令有兩條。每執(zhí)
37、行一次這種指令,就把第一操作數(shù)減1,并把結(jié)果仍保存在第一操作數(shù)中,然后判斷是否為零。若不為零,則轉(zhuǎn)移到指定的地址單元,否則順序執(zhí)行。這組指令對于構(gòu)成循環(huán)程序是十分有用的,可以指定任何一個工作寄存器或者內(nèi)部RAM單元作為循環(huán)計數(shù)器。每循環(huán)一次,這種指令被執(zhí)行一次,計數(shù)器就減1。預(yù)定的循環(huán)次數(shù)不到,計數(shù)器不會為0,轉(zhuǎn)移執(zhí)行循環(huán)操作;到達(dá)預(yù)定的循環(huán)次數(shù),計數(shù)器就被減為0,順序執(zhí)行下一條指令,也就結(jié)束了循環(huán)。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例19 將內(nèi)部RAM從DATA單元開始的10個無符號數(shù)相加,相加結(jié)果送SUM單元保存。 設(shè)相加結(jié)果不超過8位二進(jìn)制數(shù),則相應(yīng)的程序如下: MOV
38、R0,#0AH ;設(shè)置循環(huán)次數(shù) MOV R1,#DATA ;R1作地址指針,指向數(shù)據(jù)塊首地址 CLR A ;A清零LOOP: ADD A,R1 ;加一個數(shù) INC R1 ;修改指針,指向下一個數(shù) DJNZ R0,LOOP ;R0減1,不為0循環(huán) MOV SUM,A ;存10個數(shù)相加的和第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.7 子程序調(diào)用與返回指令子程序調(diào)用與返回指令3.7.1 子程序調(diào)用指令子程序調(diào)用指令子程序調(diào)用指令有長調(diào)用和絕對調(diào)用兩條,它們都是雙周期指令。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 LCALL和ACALL指令類
39、似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們在轉(zhuǎn)移前要把執(zhí)行完該指令的PC內(nèi)容自動壓入堆棧后,才將子程序入口地址addr16(或addr11)送PC,實(shí)現(xiàn)轉(zhuǎn)移。 ACALL與AJMP一樣提供11位地址,只能調(diào)用與PC在同一2 KB范圍內(nèi)的子程序。由于該指令為2字節(jié)指令,所以執(zhí)行該指令時應(yīng)執(zhí)行(PC)(PC)+2以獲得下一條指令地址,并把該地址壓入堆棧作為返回地址。該指令機(jī)器碼的構(gòu)成也與AJMP類似。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.7.2 返回指令返回指令 返回指令共兩條:一條是對應(yīng)兩條調(diào)用指令的子程序返回指令RET,另一條是對應(yīng)從中斷服務(wù)程序的返回指令RETI。第3章 M
40、CS-51指令系統(tǒng)和匯編語言程序設(shè)計 從上述兩條指令的功能操作看,都是從堆棧中彈出返回地址送PC,堆棧指針減2,但它們是兩條不同的指令。其有下面兩點(diǎn)不同: (1) 從使用上,RET指令必須作子程序的最后一條指令;RETI必須作中斷服務(wù)程序的最后一條指令。 (2) RETI指令除恢復(fù)斷點(diǎn)地址外,還恢復(fù)CPU響應(yīng)中斷時硬件自動保護(hù)的現(xiàn)場信息。執(zhí)行RETI指令后,將清除中斷響應(yīng)時所置位的優(yōu)先級狀態(tài)觸發(fā)器,使得已申請的同級或低級中斷申請可以響應(yīng);而RET指令只能恢復(fù)返回地址。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.7.3 空操作指令空操作指令 NOP ;(PC)(PC)+1 空操作指令是一條
41、單字節(jié)單周期指令。它控制 CPU不做任何操作,僅僅是消耗這條指令執(zhí)行所需要的一個機(jī)器周期的時間,不影響任何標(biāo)志位,故稱為空操作指令。NOP指令在設(shè)計延時程序、拼湊精確延時時間及在程序等待或修改程序等場合是很有用的。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.8 位操作類指令位操作類指令 位操作類指令在單片機(jī)指令系統(tǒng)中占有重要地位,這是因?yàn)閱纹瑱C(jī)在控制系統(tǒng)中主要用于控制線路通、斷,繼電器的吸合與釋放等。 位操作也稱布爾變量操作,它是以位(bit)作為單位來進(jìn)行運(yùn)算和操作的。MCS-51單片機(jī)內(nèi)部有一個功能相對獨(dú)立的布爾處理機(jī),它有借用進(jìn)位標(biāo)志CY作為位累加器,有位存儲器(即位尋址區(qū)中的各位
42、),指令系統(tǒng)中有17條專門進(jìn)行位處理的指令集。位處理指令可以完成以位為對象的數(shù)據(jù)轉(zhuǎn)送、運(yùn)算、控制轉(zhuǎn)移等操作。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 在位操作指令中,位地址的表示有以下不同的方法(以下均以程序狀態(tài)字寄存器PSW的第5位F0標(biāo)志為例說明): (1) 直接位地址表示,如D5H。 (2) 點(diǎn)表示(說明是什么寄存器的什么位),如PSW.5,說明是PSW的第5位。 (3) 位名稱表示,如直接用F0表示。 (4) 用戶定義名稱表示,如用戶定義用FLG這一名稱來代替F0,則在指令中允許用FLG表示F0標(biāo)志位。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計表3.6 條件轉(zhuǎn)移指令 第3章
43、MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例20 利用位操作指令,模擬圖3.6所示硬件邏輯電路的功能。圖3.6 硬件邏輯電路圖第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計參考程序如下: PR2: MOV C,P1.1 ;(CY) (P1.1) ORL C,P1.2 ;(CY) (P1.1) (P1.2)CPL C; =AANL C,P1.0 ;(CY)(P1.0)A CPL C ;(CY)(P1.0)A=B MOV F0,C ;F0內(nèi)暫存B MOV C,P1.3 ;(CY)(P1.3) ANL C,/P1.4 ;(CY)(P1.3)(P1.4)CPL C; =D ORL C,F(xiàn)0 ;(CY)B
44、D MOV P1.5,C ;運(yùn)算結(jié)果送入P1.5 RET第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.9 匯編程序格式與偽指令匯編程序格式與偽指令 1匯編程序格式匯編程序格式 標(biāo)號: 操作碼助記符 源操作數(shù),目的操作數(shù) ;注釋 標(biāo)號用在指令的前邊,必須跟:,表示符號地址第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 2偽指令偽指令 偽指令不要求計算機(jī)做任何操作,也沒有對應(yīng)的機(jī)器碼,不產(chǎn)生目標(biāo)程序,不影響程序的執(zhí)行,僅僅是能夠幫助進(jìn)行匯編的一些指令。它主要用來指定程序或數(shù)據(jù)的起始位置,給出一些連續(xù)存放數(shù)據(jù)的地址或?yàn)橹虚g運(yùn)算結(jié)果保留一部分存儲空間以及表示源程序結(jié)束等等。第3章 MCS-51指令
45、系統(tǒng)和匯編語言程序設(shè)計 1) 設(shè)置目標(biāo)程序起始地址偽指令ORG 格式:符號: ORG 地址(十六進(jìn)制表示) 該偽指令的功能是規(guī)定其后面的目標(biāo)程序或數(shù)據(jù)塊的起始地址。它放在一段源程序(主程序、子程序)或數(shù)據(jù)塊的前面,說明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是ORG后面給出的地址。例如: ORG 2000HSTART:MOV A,#7FH第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 2) 結(jié)束匯編偽指令END 格式:符號: END END是匯編語言源程序的結(jié)束標(biāo)志,表示匯編結(jié)束。在END以后所寫的指令,匯編程序都不予處理。一個源程序只能有一個END命令,否則就有一部分指令不能被匯編。如果END
46、前面加標(biāo)號的話,則應(yīng)與被結(jié)束程序段的起始點(diǎn)的標(biāo)號一致,以表示結(jié)束的是哪一個程序段。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 3) 定義字節(jié)偽指令DB 格式:標(biāo)號: DB 項(xiàng)或項(xiàng)表 其中項(xiàng)或項(xiàng)表指一個字節(jié)數(shù)據(jù),用逗號分開的字節(jié)數(shù)據(jù)串,或以引號括起來的字符串。該偽指令的功能是把項(xiàng)或項(xiàng)表的數(shù)據(jù)(字符串按字符順序以ASCII碼)存入從標(biāo)號地址開始的連續(xù)存儲單元中。例如: ORG 2000HTAB1: DB 30H,8AH,7FH,73 DB 5,A,BCD第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 由于ORG 2000H,所以TAB1的地址為2000H,因此,以上偽指令經(jīng)匯編后,將對2000
47、H開始的連續(xù)存儲單元賦值:(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H ;十進(jìn)制數(shù)73以十六進(jìn)制數(shù)存放(2004H)=35H ;35H是數(shù)字5的ASCII碼(2005H)=41H ;41H是字母A的ASCII碼(2006H)=42H ;42H是字符串BCD中B的ASCII碼(2007H)=43H ;43H是字符串BCD中C的ASCII碼(2008H)=44H ;44H是字符串BCD中D的ASCII碼第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 4) 定義字偽指令DW 格式:標(biāo)號: DW 項(xiàng)或項(xiàng)表 DW偽指令與DB相似,但用于定義字的內(nèi)容。項(xiàng)或項(xiàng)表指
48、所定義的一個字(兩個字節(jié))或用逗號分開的字串。匯編時,機(jī)器自動按高8位先存入,低8位在后的格式排列。例如: ORG 1500HTAB2: DW 1234H,80H 匯編以后:(1500H)=12H,(1501H)=34H,(1502H)=00H, (1503H)=80H第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 5) 預(yù)留存儲空間偽指令DS 格式:標(biāo)號: DS 表達(dá)式 該偽指令的功能是從標(biāo)號地址開始,保留若干個字節(jié)的內(nèi)存空間以備存放數(shù)據(jù)。保留的字節(jié)單元數(shù)由表達(dá)式的值決定。例如: ORG 1000H DS 20H BD 30H,8FH 匯編后從1000H開始,預(yù)留32(20H)個字節(jié)的內(nèi)存單
49、元,然后從1020H開始,按照下一條DB指令賦值,即(1020H)=30H,(1021H)=8FH。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 6) 等值偽指令EQU 格式:標(biāo)號: EQU 項(xiàng) 該偽指令的功能是將指令中的項(xiàng)的值賦予EQU前面的標(biāo)號。項(xiàng)可以是常數(shù)、地址標(biāo)號或表達(dá)式。例如:TAB1: EQU 1000HTAB2: EQU 2000H 匯編后TAB1、TAB2分別具有值1000H、2000H。 用EQU偽指令對某標(biāo)號賦值后,該標(biāo)號的值在整個程序中不能再改變。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 7) 位地址定義偽指令BIT 格式:標(biāo)號: BIT 位地址 該偽指令的功能是
50、將位地址賦予BIT前面的標(biāo)號,經(jīng)賦值后可用該標(biāo)號代替BIT后面的位地址。例如:PLG:BIT F0AI: BIT P1.0 經(jīng)以上偽指令定義后,在程序中就可以把FLG和AI作為位地址來使用。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計作業(yè):作業(yè): P75 3-1 3-4 3-10第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計3.10 匯編程序設(shè)計示例匯編程序設(shè)計示例3.10.1 算術(shù)、邏輯處理程序算術(shù)、邏輯處理程序 例例21 將一個雙字節(jié)數(shù)存入片內(nèi)RAM。 設(shè)該待存雙字節(jié)數(shù)高字節(jié)在工作寄存器R2中,低字節(jié)在累加器A中,要求高字節(jié)存入片內(nèi)RAM的36H單元,低字節(jié)存入35H單元,則相應(yīng)的參考程
51、序如下:MOV R0,#35H ;R0作指向片內(nèi)RAM單元的地址指針,先指向35H 單元MOV R0,A ;低字節(jié)存入35H單元INC R0 ;使R0指向36H單元XCH A,R2 ;R2與A的內(nèi)容交換,待存高字節(jié)交換到A中MOV R0,A ;高字節(jié)存入36H單元,A的內(nèi)容未受影響XCH A,R2 ;R2與A的內(nèi)容再次交換,兩者的內(nèi)容恢復(fù)原狀第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例22 多字節(jié)無符號數(shù)相加。 設(shè)被加數(shù)與加數(shù)分別在以ADR1與ADR2為初址的片內(nèi)數(shù)據(jù)存儲器區(qū)域中,自低字節(jié)起,由低到高依次存放;它們的字節(jié)數(shù)為L,要求加得的和放回被加數(shù)的單元。流程框圖如圖3.7所示。 圖
52、3.7 例22的程序流程框圖 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計參考程序如下: MOV R0,#ADR1 MOV R1,#ADR2 MOV R2,#L CLR CLOOP: MOV A,R0;通過R0間址,取得被加數(shù)的一 ;個字節(jié) ADDC A,R1;通過R1間址,取得加數(shù)的一個字 ;節(jié),與被加數(shù)的相應(yīng)字節(jié)相加 MOV R0,A ;加得的和通過R0間址放回原被;加數(shù)單元INC R0 ;修改指針,指向下一個相加的數(shù)INC R1DJNZ R2,LOOP;循環(huán)實(shí)現(xiàn)多字節(jié)數(shù)相加第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例23 將R1、R2、R3、R4四個工作寄存器中的BCD碼數(shù)據(jù)依
53、次相加,要求中間計算結(jié)果與最后的和都仍為BCD碼,且存入片內(nèi)RAM。 設(shè)四個工作寄存器中的BCD碼數(shù)據(jù)相加后其和仍為2位BCD碼,無溢出;(R1)+(R2)后的和存入片內(nèi)RAM的30H單元,再加(R3)后的和存入31H單元,總的和存入32H單元。則主程序?yàn)椋篛RG 0050HMOV R0,#30H MOV A,R1第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計ADD A,R2 ;(R1)+(R2)ACALL SUB ;調(diào)用子程序進(jìn)行BCD調(diào)整,并存和ADD A,R3 ;(R1)+(R2)+(R3)ACALL SUBADD A,R4 ;(R1)+(R2)+(R3)+(R4)ACALL SUB 子
54、程序?yàn)椋?ORG 01A0H ;十進(jìn)制調(diào)整與存和子程序 SUB:MOV R7,A ;保護(hù)累加器A的內(nèi)容,以便返回主程序繼續(xù)使用 DA A MOV R0,A ;把當(dāng)前和調(diào)整成BCD碼后存入R0所指單元 INC R0 ;調(diào)整地址指針 MOV A,R7 ;恢復(fù)累加器A的內(nèi)容,使A中仍為調(diào)用子程序時的和 RET ;返主第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例24 使雙字節(jié)數(shù)依次右移1位。 設(shè)該雙字節(jié)數(shù)的高字節(jié)已在工作寄存器R2中,低字節(jié)已在累加器A中,則下列程序可滿足要求: SETB C ;C預(yù)置1 XCH A,R2 ;R2與A內(nèi)容交換,高字節(jié)進(jìn)A JB A.7,ELSE ;A.7(原R2
55、第7位)為1轉(zhuǎn),否則C清零 CLR C 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計ELSE:RRC A ;A(原R2內(nèi)容)帶C循環(huán)右移1位,移位后原R2第7位的值 ;保持不變,原R2零位則進(jìn)C XCH A,R2 ;移位后原R2內(nèi)容自A交換回R2,A內(nèi)容自R2交換回A, ;準(zhǔn)備移位 RRC A ;低字節(jié)帶C(原R2零位)循環(huán)右移1位,A.0則移入C后丟失 依次右移1位相當(dāng)于原數(shù)除以2。程序中開始時將C置1,以后又根據(jù)R2第7位是否為1而進(jìn)行分支,目的是用C的值使R2第7位保持不變,使該程序段可適合于處理帶符號的雙字節(jié)數(shù)。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例25 多字節(jié)數(shù)求補(bǔ)。
56、 設(shè)該多字節(jié)數(shù)由低字節(jié)到高字節(jié)依次存放在片內(nèi)RAM的以30H為起始地址的區(qū)域中,求補(bǔ)后放回原處,則相應(yīng)的程序?yàn)椋?ORG 1000H MOV R2,#LH ;R2作循環(huán)計數(shù)器,放置待處理字節(jié)數(shù) MOV R0,#30H ;R0作為地址指針,指向待處理首數(shù)的地址 MOV A,R0 ;自片內(nèi)RAM 30H單元取最低字節(jié) CPL A ;最低字節(jié)取反 ADD A,#1 ;求補(bǔ)時最低字節(jié)取反后再加1 MOV R0,A ;最低字節(jié)取反后送存 DEC R2 ;已處理一個字節(jié),待處理字節(jié)數(shù)減1第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計NEXT:INC R0 ;調(diào)整地址指針,指向下一個字節(jié) MOV A,R0
57、;取下一個字節(jié) CPL A ;非最低字節(jié)求補(bǔ)時只需取反 ADDC A,#0 ;本條指令真正用意是計及處理前一個字節(jié)時可能有的進(jìn)位 MOV R0,A ;本字節(jié)處理后送存 DJNZ R2,NEXT ;循環(huán)處理多字節(jié)求補(bǔ)第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例26 統(tǒng)計自P1口輸入的字串中正數(shù)、負(fù)數(shù)、零的個數(shù)。 設(shè)R0、R1、R2三個工作寄存器分別為統(tǒng)計正數(shù)、負(fù)數(shù)、零的個數(shù)的計數(shù)器。完成本任務(wù)的流程框圖如圖3.8所示。圖3.8 例26流程框圖 第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計參考程序如下: START:CLR A MOV R0,A MOV R1,A MOV R2,A ENT
58、ER:MOV A,P1 ;自P1口取一個數(shù) JZ ZERO ;該數(shù)為0,轉(zhuǎn)ZERO JB P1.0,NEG ;該數(shù)為負(fù),轉(zhuǎn)NEG INC R0 ;該數(shù)不為0、不為負(fù),則必為正數(shù),R0內(nèi)容加1 SJMP ENTER ;循環(huán)自P1口取數(shù) ZERO: INC R2 ;零計數(shù)器加1 SJMP ENTER NEG: INC R1 ;負(fù)數(shù)計數(shù)器加1 SJMP ENTER第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 例例27 雙字節(jié)無符號數(shù)乘法子程序設(shè)計。 算法:兩個雙字節(jié)無符號數(shù)分別放在R7、R6和R5、R4中。由于MCS-51單片機(jī)指令中只有8位數(shù)的乘法指令MUL,用它來實(shí)現(xiàn)雙字節(jié)數(shù)乘法時,可把乘數(shù)分
59、解為: (R7)(R6) = (R7) 28 + (R6) (R5)(R4) = (R5) 28+(R4)則這兩個數(shù)的乘積可表示為: (R7)(R6)(R5)(R4) = (R7) 28 + (R6) (R5) 28 + (R4) = (R7) (R5) 216 + (R7) (R4) 28 + (R6) (R5) 28 + (R6) (R4) = (R04) (R03) (R02) (R01)第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計 顯然,我們將(R6) (R4)放入(R02) (R01)中,將(R7) (R4)和(R6) (R5)累加到(R03) (R02)中,再將(R7) (R5)
60、 累加到(R04) (R03)中即可得到乘積結(jié)果。 入口:(R7 R6)=被乘數(shù),(R5 R4)=乘數(shù),(R0)=乘積的低位字節(jié)地址指針。 出口:(R0)=乘積的高位字節(jié)地址指針,指向32位積的高8位。 工作寄存器:R3、R2存放部分積,R1存放進(jìn)位位。第3章 MCS-51指令系統(tǒng)和匯編語言程序設(shè)計程序清單如下:MUL1:MOV A,R6 ;取被乘數(shù)的低字節(jié)到A MOV B,R4 ;取乘數(shù)的低字節(jié)到B MUL AB ;(R6) (R4) MOV R0,A ;R01存乘積低8位 MOV R3,B ;R3暫存(R6) (R4)的高8位 MOV A,R7 ;取被乘數(shù)的高字節(jié)到A MOV B,R4 ;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度某網(wǎng)絡(luò)安全培訓(xùn)與咨詢服務(wù)合同2篇
- 2025年加盟商店鋪員工晉升方案協(xié)議
- 2025年股權(quán)投資合作協(xié)議修訂范本2篇
- 2025年代理業(yè)務(wù)合同書范本
- 2025年變電站規(guī)劃設(shè)計合同
- 2025年度高新技術(shù)企業(yè)授權(quán)協(xié)議書范文3篇
- 2025年消防工程設(shè)計與咨詢合同協(xié)議書3篇
- 二零二五年科技產(chǎn)品廣告合作合同書
- 二零二五版綠色施工規(guī)范下建筑垃圾清運(yùn)及處理協(xié)議3篇
- 2025年度城市道路路燈廣告資源整合利用合同4篇
- 臺資企業(yè)A股上市相關(guān)資料
- 電 梯 工 程 預(yù) 算 書
- 羅盤超高清圖
- 參會嘉賓簽到表
- 機(jī)械車間員工績效考核表
- 形式發(fā)票格式2 INVOICE
- 2.48低危胸痛患者后繼治療評估流程圖
- 人力資源管理之績效考核 一、什么是績效 所謂績效簡單的講就是對
- 山東省醫(yī)院目錄
- 云南地方本科高校部分基礎(chǔ)研究
- 廢品管理流程圖
評論
0/150
提交評論