單片機的指令系統(tǒng).ppt
《單片機的指令系統(tǒng).ppt》由會員分享,可在線閱讀,更多相關(guān)《單片機的指令系統(tǒng).ppt(103頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1 指令概述尋址方式數(shù)據(jù)傳送類指令算術(shù)運算類指令邏輯操作類指令控制轉(zhuǎn)移類指令位操作指令 第3章80C51的指令系統(tǒng) 本章內(nèi)容 2 3 1指令系統(tǒng)簡介 1 指令概述一臺微機所具有的所有指令的集合 就構(gòu)成了指令系統(tǒng) 指令系統(tǒng)越豐富 說明CPU的功能越強 2 機器指令一臺微機能執(zhí)行什么樣的操作 是在微機設(shè)計時確定的 一條指令對應(yīng)著一種基本操作 由于計算機只能識別二進(jìn)制數(shù) 所以指令也必須用二進(jìn)制形式來表示 稱為指令的機器碼或機器指令 MCS 51單片機指令系統(tǒng)共有33種功能 42種助記符 111條指令 3 1 二進(jìn)制的表示形式 以 累加器的內(nèi)容 08H 為例 00100100B操作碼OP 加法 00001000B操作數(shù)DATA 08H 特點 能被CPU直接識別 運行的形式 也稱機器碼 匯編語言的目標(biāo)代碼 缺點 不便于閱讀 記憶和調(diào)試修改 3 指令表示 4 2 十六進(jìn)制表示方式 它是對二進(jìn)制形式的一種簡化 00100100B24H00001000B08H 二進(jìn)制表示的形式十六進(jìn)制表示的形式 在實驗室等少數(shù)環(huán)境下 可以將這種形式作為輸入程序的一種輔助手段 但是 這種形式的指令格式必須由對應(yīng)的監(jiān)控程序把它們翻譯成二進(jìn)制的 機器碼 后存入程序存儲器并運行 5 3 指令的 助記符 方式 也稱 匯編格式 00100100B24H00001000B08HADDA 08H 二進(jìn)制表示形式十六進(jìn)制表示匯編格式 返回 1 這是一種由英文單詞或字母 數(shù)字來表征指令功能的形式 是一種便于閱讀 書寫和交流的表示形式 2 匯編 格式的指令必須 翻譯 為二進(jìn)制形式 機器碼 后才能為CPU所識別和執(zhí)行 3 三種不同的表示方法適用于不同的場合 6 指令格式 既指令的結(jié)構(gòu)形式 操作碼 操作數(shù)或操作數(shù)地址 由操作碼和操作數(shù) 或操作數(shù)地址 構(gòu)成指令的結(jié)構(gòu) 舉例 MOVA 0FFHADDA R0 返回 4 指令格式 7 采用助記符表示的匯編語言指令格式如下 標(biāo)號是程序員根據(jù)編程需要給指令設(shè)定的符號地址 可有可無 標(biāo)號由1 8個字符組成 第一個字符必須是英文字 不能是數(shù)字或其它符號 標(biāo)號后必須用冒號 4 指令格式 8 操作碼表示指令的操作種類 如MOV表示數(shù)據(jù)傳送操作 ADD表示加法操作等 操作數(shù)或操作數(shù)地址表示參加運算的數(shù)據(jù)或數(shù)據(jù)的有效地址 操作數(shù)一般有以下幾種形式 沒有操作數(shù)項 操作數(shù)隱含在操作碼中 如RET指令 只有一個操作數(shù) 如CPLA指令 有兩個操作數(shù) 如MOVA 00H指令 操作數(shù)之間以逗號相隔 有三個操作數(shù) 如CJNEA 00H NEXT指令 操作數(shù)之間也以逗號相隔 注釋是對指令的解釋說明 用以提高程序的可讀性 注釋前必須加分號 4 指令格式 9 在MCS 51單片機的指令系統(tǒng)中 因指令操作碼和操作數(shù)的不同 指令 在存儲器中 長度也各不相同 分為單字節(jié) 雙字節(jié)和三字節(jié) 單字節(jié)指令 49條 分無操作數(shù) 有操作數(shù)兩種 無操作數(shù) 如INCDPTR10100011BINCA00000100B 特點 操作數(shù)隱含在操作碼中 含有操作數(shù)寄存器名稱的單字節(jié)指令 如 MOVA R011101000BMOVA R111101001B 特點 寄存器名以三位數(shù)代碼的形式在指令的后三位 5 指令長度與執(zhí)行時間 5 指令長度與執(zhí)行時間 10 雙字節(jié)指令 46條 指令的操作碼和操作數(shù)各占一個字節(jié) 如 MOVA data01110100Bdata很明顯 8位的操作數(shù)本身占據(jù)一個字節(jié) n n 1 MOVA data 雙字節(jié)指令在程序存儲器的存放示意圖 5 指令長度與執(zhí)行時間 11 三字節(jié)指令 16條 指令中的操作數(shù)為雙字節(jié) 如 MOVDPTR data161001000B data15 8 data7 0或者 指令中分別包含1個字節(jié)的操作數(shù)和1個字節(jié)的操作數(shù)地址 如 MOVdirect data舉例 MOV20H 0FFH MOVDPTR data16 MOVdirect data 三字節(jié)指令在存儲器中存放的方式示意圖 5 指令長度與執(zhí)行時間 12 指令的字節(jié)多是否意味著指令周期就長 從表中可見 指令的字節(jié)數(shù)與指令周期不是對等的關(guān)系 返回 5 指令長度與執(zhí)行時間 5 指令長度與執(zhí)行時間 13 6 符號說明 參見P51說明 14 3 2尋址方式 找到參與運算的數(shù)據(jù)或數(shù)據(jù)所在的地址的方式 稱為尋址方式 尋址方式主要是指源操作數(shù)的尋址 15 目的地 XXH 操作數(shù) MOVP1 55H MOVA 01H 55H 目的地 信 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對尋址 位尋址 1 立即數(shù)尋址 16 MOVP1 55H 將立即數(shù)55H送P1口MOV20H 55 將立即數(shù)55H送20H單元MOVA 0F0H 將立即數(shù)0F0H送累加器AMOVR4 0FH 將立即數(shù)0FH送寄存器R4中MOVR0 20H 將立即數(shù)20H送寄存器R0口ANDA 0FH A的內(nèi)容與立即數(shù)0FH與操作ORLA 0F0H A的內(nèi)容與立即數(shù)0F0H或操作MOVA 01H 將立即數(shù)01H送累加器A中MOVA 55H 將立即數(shù)55H送累加器A中 注意 1 2 不能作為目的 3 注意 0F0H的意義 17 MOVA 3AH直接尋址是指把存放操作數(shù)的內(nèi)存單元的地址直接寫在指令中 在MCS 51單片機中 可以直接尋址的存儲器主要有內(nèi)部RAM區(qū)和特殊功能寄存器SFR區(qū) 參見P37 2 直接尋址 18 3 寄存器尋址 MOVR1 A寄存器尋址是指將操作數(shù)存放于寄存器中 寄存器包括工作寄存器R0 R7 累加器A 通用寄存器B 地址寄存器DPTR等 例如 指令MOVR1 A的操作是把累加器A中的數(shù)據(jù)傳送到寄存器R1中 其操作數(shù)存放在累加器A中 所以尋址方式為寄存器尋址 19 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對尋址 位尋址 設(shè)R0 3AH 內(nèi)部RAM3AH中的值是65H 則指令MOVA R0的執(zhí)行結(jié)果是累加器A的值為65H 目的地 寄存器 操作數(shù) 3AH 內(nèi)部RAM 3AH 65H 3AH R0R1DPTR 目的地 2號 信在2號箱子里 1號 注意 1 間接尋址的標(biāo)志 2 R0 R1 SP DPTR 4 寄存器間接尋址 20 尋址比較 MOVP1 R0 MOVP1 R0 MOVP1 20H MOVP1 20H MOVP1 R0 21 MOVP1 R0 MOVP1 R0 MOVP1 20H MOVP1 20H MOVP1 R0 22 MOVP1 R0 MOVP1 R0 MOVP1 20H MOVP1 20H MOVP1 20H 23 MOVP1 R0 MOVP1 R0 MOVP1 20H MOVP1 20H MOVP1 20H 24 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對尋址 位尋址 MOVCA A DPTRMOVCA A PCJMP A DPTR 目的地 寄存器 操作數(shù) 內(nèi)部RAM 3AH 65H 3AH 基址寄存器12H 變址寄存器34H 內(nèi)部RAM 46H 65H A DPTRPC 46H 5 變址尋址 25 26 目的地 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對尋址 XXH 位尋址 操作數(shù) ORG2000HSJMP54HSJMP2056H出現(xiàn)的格式 PC 54H PC 2002H 2002H 2056H PC 2056H 6 相對尋址 27 設(shè)指令SJMP54H的機器碼80H54H存放在2000H處 當(dāng)執(zhí)行到該指令時 先從2000H和2001H單元取出指令 PC自動變?yōu)?002H 再把PC的內(nèi)容與操作數(shù)54H相加 形成目標(biāo)地址2056H 再送回PC 使得程序跳轉(zhuǎn)到2056H單元繼續(xù)執(zhí)行 28 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對尋址 位尋址 1 00000000 想一想 如果想使27H單元的第3位置1 該怎么辦呢 7 位尋址 29 位尋址地址表 例 SETB3DH 3D 3C 3B 3F 3E 3A 39 38 27H 30 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對尋址 位尋址 SETB3DH 0000000 1 0 位地址的表示方式 31 3 3數(shù)據(jù)傳送指令 按功能 MCS 51指令系統(tǒng)可分為下列5類 數(shù)據(jù)傳送指令 29條 算術(shù)運算指令 24條 邏輯運算指令 24條 控制轉(zhuǎn)移指令 17條 位操作指令 17條 32 數(shù)據(jù)傳送類指令共29條 它是指令系統(tǒng)中最活躍 使用最多的一類指令 一般的操作是把源操作數(shù)傳送到目的操作數(shù) 即指令執(zhí)行后目的操作數(shù)改為源操作數(shù) 而源操作數(shù)保持不變 若要求在進(jìn)行數(shù)據(jù)傳送時 不丟失目的操作數(shù) 則可以用交換型傳送指令 指令通式 MOV 目的地址源地址 數(shù)據(jù) 20H A 33 數(shù)據(jù)傳送類指令不影響進(jìn)位標(biāo)志CY 半進(jìn)位標(biāo)志AC和溢出標(biāo)志OV 但當(dāng)傳送或交換數(shù)據(jù)后影響累加器A的值時 奇偶標(biāo)志P的值則按A的值重新設(shè)定 按數(shù)據(jù)傳送類指令的操作方式 又可把傳送類指令分為3種類型 數(shù)據(jù)傳送 數(shù)據(jù)交換和堆棧操作 并使用8種助記符 MOV MOVX MOVC XCH XCHD SWAP PUSH及POP 34 1 數(shù)據(jù)傳送到累加器A的指令MOVA RnMOVA directMOVA RiMOVA data這組指令的功能是 把源操作數(shù)的內(nèi)容送入累加器A 例如 MOVA 10H 該指令執(zhí)行時將立即數(shù)10H送入累加器A中 3 3 1內(nèi)部RAM傳送指令 35 例3 3 1已知 A 20H R0 50H 內(nèi)部RAM中 40H 30H 50H 10H 指出下列指令執(zhí)行后相應(yīng)單元內(nèi)容的變化情況 MOVA 40HMOVA 40HMOVA R0MOVA R0 36 2 數(shù)據(jù)傳送到工作寄存器Rn的指令MOVRn AMOVRn directMOVRn data這組指令的功能是 把源操作數(shù)的內(nèi)容送入當(dāng)前工作寄存器區(qū)的R0 R7中的某一個寄存器 指令中Rn在內(nèi)部數(shù)據(jù)存儲器中的地址由當(dāng)前的工作寄存器區(qū)選擇位RS1 RS0確定 可以是00H 07H 08H 0FH 10H 17H 18H 1FH 例如 MOVR0 A 若當(dāng)前RS1 RS0設(shè)置為00 即工作寄存器0區(qū) 執(zhí)行該指令時 將累加器A中的數(shù)據(jù)傳送至工作寄存器R0 內(nèi)部RAM00H 單元中 37 3 數(shù)據(jù)傳送到內(nèi)部RAM單元 直接地址 MOVdirect AMOVdirect RnMOVdirect directMOVdirect RiMOVdirect data4 數(shù)據(jù)傳送到內(nèi)部RAM單元 間接地址 MOV Ri AMOV Ri directMOV Ri data 38 5 16位數(shù)傳送指令 MCS 51指令系統(tǒng)中唯一的一條16位數(shù)據(jù)傳送類指令 MOVDPTR data16DPTR是單片機內(nèi)部SFR中的兩個寄存器DPH DPL組合而成 其中DPH為高八位 DPL為低八位 DPTR是一個專門用于訪問外部存儲器的間址寄存器 尋址能力為64K 0 65535 39 例3 3 2已知 R0 50H R1 66H R6 30H內(nèi)部RAM中 50H 60H 66H 45H 70H 40H指出下列指令執(zhí)行后相應(yīng)單元內(nèi)容的變化情況 MOVA R6MOVR7 70HMOV70H 50HMOV40H R0MOV R1 88H 40 實現(xiàn)外部RAM和累加器A之間的數(shù)據(jù)傳送 只有寄存器間接尋址的指令 MOVXA Ri使用Ri寄存器間址尋址范圍0 255hMOVX Ri A在硬件電路中P0口輸出8位地址數(shù)據(jù) MOVXA DPTR使用DPTR間址 尋址范圍0 65535hMOVX DPTR A在硬件電路中 使用P0口輸出低8位 P2口輸出高8位外部RAM地址 3 3 2外部RAM傳送指令 41 外部RAM的字節(jié)傳送指令舉例 已知外部RAM的88H單元有一個數(shù)x 試編程將x送外部RAM的1818H單元 解 外部RAM中的數(shù)據(jù)是不能直接傳送的 因此必須使用兩次MOVX指令完成此操作 ORG2000HMOVR0 88H 為8位指針賦值MOVDPTR 1818H 為16位指針賦值MOVXA R0 取x到累加器AMOVX DPTR A x送RAM的1818h單元SJMP 停機END 返回 42 3 3 3數(shù)據(jù)交換指令 為提供一種方便的累加器和寄存器或RAM之間的數(shù)據(jù)交換 避免了使用一般MOV傳送指令完成交換時的不便 格式 XCHA Rn A RnXCHA direct A direct XCHA Ri A Ri XCHDA Ri A3 0 Ri 3 0SWAPA A3 0 A4 7 43 數(shù)據(jù)交換指令舉例 已知 片外RAM20h單元 內(nèi)部RAM20h單元分別有數(shù)x和y 試編程互將兩數(shù)相交換 MOVR1 20h 指針賦初值MOVXA R1 x aXCHA R1 交換a 20h y aMOVX R1 A y 20h 片外RAM y x 20h 20h 累加器A 1 2 3 44 3 3 4ROM的字節(jié)傳送指令 查表指令 這類指令有兩條 都屬于變址尋址指令 MOVCA A DPTR A A DPTR MOVCA A PC PC PC 1 A A PC 該指令也稱為 查表 指令 在ROM中建立一個數(shù)據(jù)表 可以使用DPTR PC作為數(shù)據(jù)表格的基地址 在第一條指令中 用DPTR作為基地址 使用前 先將數(shù)據(jù)表的首地址送入DPTR中 累加器A作為偏移量 由兩者數(shù)據(jù)相加得到待查的表中數(shù)據(jù)地址并取出 遠(yuǎn)程查表指令 第二條指令是以程序計數(shù)器PC為基地址 由于PC的內(nèi)容與該指令在ROM中的位置有關(guān) 所以一旦該指令在程序中的位置確定 其PC的值也就確定 近程查表指令 P62 45 ROM的字節(jié)傳送指令舉例 已知累加器A中存有0 9范圍內(nèi)的數(shù) 試用查表指令編寫出查找出該數(shù)平方的程序 采用DPTR作基址寄存器 設(shè)平方表的首地址為2000h 累加器A中的內(nèi)容恰好是查表的偏移量 首先將表的起始地址2000h送入DPTR中 MOVDPTR 2000H 指針賦值MOVCA A DPTR 平方值送A 2000h 2009h 2008h 2007h 2006h 2005h 2004h 2003h 2002h 2001h 46 3 3 5堆棧操作指令 堆棧操作是一種特殊的數(shù)據(jù)傳送指令 堆棧 一個用來保存程序斷點 數(shù)據(jù)的特殊的存儲區(qū)域 在MCS 51單片機中 棧區(qū)是占用片內(nèi)RAM的存儲空間 具體棧位置由指針SP來確定 系統(tǒng)上電時 SP 07H 1 進(jìn)棧操作 PUSHdirect SP 1 SP direct SP 2 出棧操作 POPdirect SP direct SP 1 SP 注意 尋址方式為直接尋址 所以PUSHA是錯誤的 應(yīng)當(dāng)是PUSHACC或PUSH0E0H 同理 PUSHR0也是錯誤的 進(jìn)棧是堆棧向上 生長 的過程 即SP 1 出棧則相反 系統(tǒng)上電時 SP 07h SP的值可以根據(jù)需要進(jìn)行修改 以適應(yīng)具體編程的需要 在確定棧區(qū)位置時要考慮對數(shù)據(jù)區(qū)的影響 以避免數(shù)據(jù)區(qū)與棧區(qū)沖突 47 堆棧操作指令舉例 一 下面是一個BCD碼轉(zhuǎn)換為二進(jìn)制的子程序BCDB中有關(guān)堆棧操作的例子 在這里 進(jìn)棧操作是為了保護(hù)主程序中相關(guān)寄存器中的數(shù)據(jù) 因為子程序要使用這些寄存器 org0800hbcdb pushPSWpushACCpushB popBpopACCpopPSWRET SP 48 堆棧操作指令舉例 二 堆棧操作指令除了可以在子程序的設(shè)計中 對主程序的數(shù)據(jù)進(jìn)行保護(hù) 還可以根據(jù)堆棧操作的特點完成一些特殊的操作 舉例 設(shè)片內(nèi)RAM的30h單元存有x 40h單元存有y 試將兩個單元內(nèi)容互換 push30hpush40hpop30hpop40h SP 07h 40h 30h 49 內(nèi)部RAM前128字節(jié) SFR之間可以相互傳送 但最多只允許1個操作數(shù)使用寄存器間接尋址 MOV R0 R1是錯誤的 訪問SFR必須使用直接尋址 不能采用寄存器間接尋址 MOVA P0或MOVA 80H正確MOVR0 80H和MOVA R0錯誤 8051沒有提供B寄存器的尋址方式 乘法除法除外 MOVA B直接尋址 注意A和ACC的區(qū)別 MOV3FH A 寄存器尋址 2字節(jié)指令 MOV3FH ACC 直接尋址 3字節(jié)指令 8051數(shù)據(jù)傳送指令的幾點說明 50 3 4算術(shù)運算指令 不帶進(jìn)位的加法指令 ADD 1 加法指令 帶進(jìn)位的加法指令 ADC 加1指令 INC 2 減法指令 帶進(jìn)位的減法指令 SUBB 減1指令 DEC 3 十進(jìn)制調(diào)整指令 DAA 4 乘法和除法指令 MULAB DIVAB 51 3 4 1加法指令 1 不帶進(jìn)位的加法指令格式 ADDA Rn A Rn AADDA direct A direct AADDA Ri A Ri AADDA data A data A 注意 1 參加運算的數(shù)據(jù)都應(yīng)當(dāng)是8位的 結(jié)果也是8位并影響PSW 2 根據(jù)編程者的需要 8位數(shù)據(jù)可以是無符號數(shù) 0 255 也可以是有符號數(shù) 128 127 52 不帶進(jìn)位的加法指令舉例 一 試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化 MOVA 19HCy 0 ADDA 66HAC 0OV C7 C6 025A 00011001BP 1 102data 01100110B127001111111B1 若兩數(shù)都是無符號數(shù) 則因Cy 0無進(jìn)位 25 102 127 2 若兩個數(shù)是有符號數(shù) 則因OV 0無溢出 cy 000C7C6AC 53 不帶進(jìn)位的加法指令舉例 二 試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化 MOVA 5AHCy 0 ADDA 6BHAC 1 OV C7 C6 190A 01011010BP 0 107data 01101011B197011000101BC7C6AC1 若兩數(shù)是無符號數(shù) 因Cy 0無進(jìn)位 90 107 1972 若兩數(shù)是有符號數(shù) 因OV 1 故有溢出 兩個正數(shù)相加后變?yōu)樨?fù)數(shù) 很明顯結(jié)果是不正確的 54 2 帶進(jìn)位的加法指令格式 ADDCA Rn A Rn Cy AADDCA direct A direct Cy AADDCA Ri A Ri Cy AADDCA data A data Cy A 注意 這里的Cy是指令執(zhí)行前的Cy 對PSW的影響同ADD指令 55 3 加1指令格式 INCA 累加器A加一INCRn Rn 1 RnINCdirect 內(nèi)存單元數(shù)據(jù)加一INC Ri 內(nèi)存單元數(shù)據(jù)加一INCDPTR dptr 1 dptr 注意 1 除了第一條對PSW的P有影響外 其余對PSW均無影響 2 由于上面的原因 INC指令不能作為一般的數(shù)據(jù)算術(shù)運算使用 INC主要用于修改數(shù)據(jù)指針等控制 循環(huán)語句中使用 56 編程舉例 已知M1 M2單元中存有兩個16位無符號數(shù)x1 x2 低位在前 試寫出x1 x2 并將結(jié)果放入M1 M1 1單元 低8位在M1單元 設(shè)兩數(shù)之和不會超過16位 65535 解 MOVR0 M1 x1指針賦初值MOVR1 M2 x2指針賦初值MOVA R0 取x1低8位送AADDA R1 x1與x2低8位相加MOV R0 A 低8位和送m1單元INCR0INCR1 修改指針MOVA R0 取x1的高8位送AADDCA R1 x1與x2的高8位和Cy相加MOV R0 A 結(jié)果送M1 1單元 M1 M1 1 M2 M2 1 57 3 4 2減法指令 帶進(jìn)位的減法指令 在MCS 51單片機的指令系統(tǒng)中 只有 帶進(jìn)位的減法SUBB 減一DEC兩種指令 1 減法指令 格式 SUBBA Rn A Rn Cy ASUBBA direct A direct Cy ASUBBA Ri A Ri Cy ASUBBA data A data Cy A 58 使用減法指令要注意的問題 在MCS 51的指令系統(tǒng)中沒有不帶Cy的減法 所以在使用SUBB指令前必須使用一條清除Cy的指令 CLRC 59 減法指令應(yīng)用舉例 試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化 CLRCMOVA C9HSUBBA 054H201a 11001001 84data 01010100117001110101 117手工計算 60 2 減一指令 格式 DECA 累加器A減一DECRn Rn 1 RnDECdirect 內(nèi)存單元數(shù)據(jù)減一DEC Ri 內(nèi)存單元數(shù)據(jù)減一 注意 1 除了第一條對PSW的P有影響外 其余對PSW均無影響 2 由于上面的原因 DEC指令一般不作為數(shù)據(jù)算術(shù)運算使用 因為不能對PSW的OV等位產(chǎn)生影響 它主要用于修改數(shù)據(jù)指針在控制 循環(huán)語句中使用 61 3 4 3十進(jìn)制調(diào)整指令 在CPU進(jìn)行BCD碼運算時 必須在運算后進(jìn)行十進(jìn)制調(diào)整 這是因為 CPU在運算時 并不知道數(shù)據(jù)是二進(jìn)制還是BCD碼 格式 DAA 若AC 1或A3 0 9 則A 06h A 若Cy 1或A7 4 9 則A 60h A 注意 1 DAA指令必須緊跟在加法指令之后 2 DAA指令只適用于加法指令的調(diào)整 62 十進(jìn)制調(diào)整指令應(yīng)用舉例 一 1 BCD加法運算 試寫出完成85 59的BCD碼的加法程序 MOVA 85HADDA 59HDAASJMP 85a 10000101B 59dtat 01011001B14411011110B低4位 9 所以加06h 00000110B11100100B高4位 9 所以加60h01100000B101000100B結(jié)果為144h 1包含在Cy 注意 144H是用16進(jìn)制數(shù)來表示十進(jìn)制 既BCD碼 63 3 4 4乘法和除法指令 這是MCS 51單片機唯一的一類單字節(jié)4周期指令 它相當(dāng)于4條加法指令的運行時間 格式 MULAB a b b a b存高8位 a存低8位 DIVAB a b a b a存商 b存余數(shù) 注意 指令對標(biāo)志的影響 1 在乘法指令中對PSW的影響有Cy OV 和P 具體如下 Cy 0 P取決于A中 1 的個數(shù) OV表明積的大小 當(dāng)積超過255 B 0 時 OV 1 2 在除法指令中 Cy P與乘法相同 在執(zhí)行除法指令時 若B 0時OV 1 表示除數(shù) 0除法無意義 其余情況下OV被復(fù)位 64 3 5邏輯運算指令 功能 對2個8位二進(jìn)制數(shù)進(jìn)行邏輯與 或 非和異或操作 特點 除了以累加器A為目標(biāo)寄存器的指令影響PSW的P位外 其余指令對PSW均無影響 1 邏輯與運算指令 ANL 2 邏輯或運算指令 ORL 3 邏輯異或指令 XRL 4 累加器清零和取反指令 CLR CPL 65 1 邏輯與運算指令 格式 ANLA Rn A Rn AANLA direct A direct AANLA Ri A Ri AANLA data A data AANLdirect A direct A directANLdirect data direct data direct上面的指令也可以分為兩類 1 以累加器A為目標(biāo)寄存器的邏輯運算指令 2 以內(nèi)存單元為目標(biāo)的邏輯運算指令 66 應(yīng)用舉例 一 已知R0 30H和 30H 0AAH 試問執(zhí)行下列指令后累加器A和30H單元中的內(nèi)容是什么 1 MOVA 0FFH2 MOVA 0FHANLA R0ANLA 30H A 30H 30H 0AAH A 0AH 30H 0AAH 3 MOVA 0F0H4 MOVA 80HANLA R0ANL30H A A 0A0H 30H 0AAH A 80H 30H 80H 很明顯 ANL操作可以從某個存儲單元中取出某幾位 而把其它的位清零 67 2 邏輯或運算指令 格式 ORLA Rn A Rn AORLA direct A direct AORA Ri A RI AORLA data A data AORLdirect A direct A directORLdirect data direct data direct同與運算一樣 上面的指令也可以分為兩類 1 以累加器A為目標(biāo)寄存器的邏輯運算指令 2 以內(nèi)存單元為目標(biāo)的邏輯運算指令 68 應(yīng)用舉例 設(shè)累加器A 0AAH P1口 0FFH 試編程將累加器A中的低四位送P1口的低四位 而P1口的高四位不變 解 MOVR0 A 累加器A中的數(shù)據(jù)暫存ANLA 0FH 屏蔽A的高4位ANLP1 0F0H 屏蔽P1口的低4位ORLP1 A 在P1口組裝MOVA R0 恢復(fù)累加器A的數(shù)據(jù) 小結(jié) 與運算可以 清零 某些位 或運算可以 置位 某些位 69 3 邏輯異或運算指令 格式 XRLA Rn A Rn AXRLA direct A direct AXRA Ri A RI AXRLA data A data AXRLdirect A direct A directXRLdirect data direct data direct特點 按位運算 相同時為0 不同時為1 使用異或可以實現(xiàn)將某個字節(jié)的數(shù)據(jù)或?qū)?shù)據(jù)的某幾位取反 70 舉例 已知 外部RAM的30H單元中有一個數(shù)AAH 現(xiàn)要將其高4位不變 低4位取反 試編程 解1 利用MOVXA Ri指令 MOVR0 30H10101010MOVXA R0 00001111XRLA 0FH10100101MOVX R0 A解2 利用MOVXA DPTRMOVDPTR 0030HMOVXA DPTRXRLA 0FHMOVX DPTR A 71 4 累加器清零和取反指令 用傳送指令可以實現(xiàn)對累加器A的清零和取反操作 但是它們都是雙字節(jié)指令 在MCS 51的指令系統(tǒng)中專門設(shè)計了單字節(jié) 單周期對累加器清零和取反的指令 格式 CLRA 累加器清零CPLA 累加器取反取反指令可以方便的實現(xiàn)求補操作 舉例 已知30H單元中有一個數(shù)x 寫出對它求補的程序 MOVA 30HCPLAINCAMOV30H A 72 A 0 A 7 A 0 A 7 A 0 A 7 A 0 A 7 CY CY RLARRARLCARRCA 注意 執(zhí)行帶進(jìn)位的循環(huán)移位指令之前 必須給CY置位或清零 5 循環(huán)移位指令 73 循環(huán)指令可以實現(xiàn)數(shù)據(jù)各位的循環(huán)移位 循環(huán)檢測 也可以對數(shù)據(jù)乘2 除2操作 MOVA 02HCLRCRLCA A 2MOVA 06HCLRCRRCA A 2 74 3 6控制轉(zhuǎn)移指令 1 無條件轉(zhuǎn)移指令2 條件轉(zhuǎn)移指令3 子程序調(diào)用和返回4 空操作指令 75 3 6 1無條件轉(zhuǎn)移指令 格式 LJMPaddr16 長轉(zhuǎn)移指令 尋址范圍65535AJMPaddr11 短轉(zhuǎn)移 尋址范圍2KSJMPrel 相對轉(zhuǎn)移 轉(zhuǎn)移范圍 127 128 JMP A DPTR 間接轉(zhuǎn)移 尋址范圍65535 LJMP指令 三字節(jié) AJMP指令 雙字節(jié) SJMP指令 雙字節(jié) JMP指令 單字節(jié) 76 1 長轉(zhuǎn)移指令 三字節(jié)雙周期指令 指令執(zhí)行時 將指令碼中的addr16送入PC中 使程序無條件的轉(zhuǎn)向addr16所指向的新地址執(zhí)行程序 舉例 已知某單片機的監(jiān)控程序地址為A080H 試問用什么方法使單片機開機后自動的轉(zhuǎn)向該監(jiān)控程序 解 因為單片機上電時 PC 0000H 所以在0000H單元存放一條LJMP0A080H的指令即可 ROM 0000H0001H0002H0003H 77 2 短轉(zhuǎn)移指令 雙字節(jié) 雙周期指令 將AJMP指令中的11位轉(zhuǎn)移地址替換掉原來PC中16位地址中的低11位地址 指令中的11位地址 確定了地址的轉(zhuǎn)移范圍在2K以內(nèi) 所以AJMP也稱 頁內(nèi)轉(zhuǎn)移 指令 A10a9a8操作碼a7 a0 AJMP指令 PC程序計數(shù)器 78 MCS 51的ROM系統(tǒng)是以2K為一頁來劃分程序存儲器 這樣對于4K的片內(nèi)ROM存儲器可以分為2頁 片外64K的ROM可以分為32頁 在執(zhí)行AJMP指令時 PC的高5位決定了ROM中的頁地址 而AJMP指令的低11位地址用來選擇頁內(nèi)地址 在一般情況下 AJMP指令應(yīng)當(dāng)與目標(biāo)地址在同一頁內(nèi) 更具體的說 目標(biāo)地址應(yīng)當(dāng)與AJMP指令取出后的PC值 PC PC 2 在同一頁內(nèi) 否則轉(zhuǎn)移將會出現(xiàn)錯誤 79 ROM的64K存儲空間的頁面 部分 劃分表 80 ROM的64K存儲空間的頁面示意圖 AAA MOVA R0MOVR1 A AJMPAAA 0100H 07FEH 00000111111111111110 PC值 00001000000000000000 PC 2值 00001001000000000000 AJMP指令中的11位地址 原本AJMP指令要轉(zhuǎn)到本頁的0100H單元但是由于PC的高5位頁面地址發(fā)生了變化使AJMP指令實際轉(zhuǎn)到下一頁0900H單元 最后PC值 發(fā)生跨頁錯誤 81 AJMP轉(zhuǎn)一指令是用來做頁內(nèi)2K范圍的轉(zhuǎn)移 如果使用不當(dāng) 會發(fā)生錯誤的 跨頁 操作 產(chǎn)生跨頁的原因是AJMP指令處于每一頁的最后兩個單元的結(jié)果 所以避免這種現(xiàn)象的方法就是不要在每一頁的最后兩個單元使用AJMP指令 如果目標(biāo)地址與AJMP地址不再同一頁內(nèi) 建議使用LJMP指令替代AJMP 使用AJMP指令時 11位的絕對地址可以用符號地址取代 正確使用AJMP轉(zhuǎn)移指令 82 3 相對轉(zhuǎn)移SJMP指令 格式 SJMPrelrel為偏移量 127 128 rel 偏移量 的計算公式 rel 目標(biāo)地址 源地址 2 其中 2為SJMP指令的長度 例1 如圖 要轉(zhuǎn)到0116H時 rel 0116H 0110H 2 04H 例2 要轉(zhuǎn)到0109H時 rel 0109H 0110H 2 F7H 9 實際編程時 使用符號地址取代rel以簡化計算 在匯編時由匯編程序來計算rel PC PC 2 0109H 0110H 0116H 83 4 間接轉(zhuǎn)移指令 散轉(zhuǎn)指令 格式 JMP A DPTR單字節(jié)操作碼為73H特點 轉(zhuǎn)移地址由累加器A的內(nèi)容與DPTR相加形成 用途 用來制作一個多分支的轉(zhuǎn)移結(jié)構(gòu) 舉例 MOVDPTR TABLE 指針賦表頭地址JMPA A DPTR 轉(zhuǎn)移地址由A DPTR產(chǎn)生TABLE AJMPROUT0 多分支轉(zhuǎn)移表AJMPROUT1AJMPROUT1AJMPROUT2 84 3 6 2條件轉(zhuǎn)移指令 1 累加器A判零轉(zhuǎn)移指令 雙字節(jié)指令 JZrel 若A 0 則PC PC 2 rel 若A 0 則PC PC 2JNZrel 若A 0 則PC PC 2 rel 若A 0 則PC PC 2 85 2 比較不相等轉(zhuǎn)移指令 3字節(jié) a data時 PC 3 PC Cy 0CJNEA data rela data時 PC 3 rel Cy 0CJNERn data rela Y Cy 1則X Y 86 3 減一條件轉(zhuǎn)移指令 1 DJNZRn rel Rn 1 Rn 若Rn 0則PC 2 rel PC 若Rn 0則PC 2 PC2 DJNZdirect rel direct 1 direct 若 direct 0則PC 3 rel PC 若 direct 0則PC 3 PC注意 第一條指令為雙字節(jié) 第二條指令為三字節(jié) 指令本身先做一個帶回送的減一運算操作 然后根據(jù)運算的結(jié)果是否為零作為轉(zhuǎn)移的條件 例如 有一段程序如下 MOV23H 0AHCLRALOOPX ADDA 23HDJNZ23H LOOPXSJMP 該程序執(zhí)行后 A 10 9 8 7 6 5 4 3 2 1 37H 87 88 應(yīng)用舉例 令片內(nèi)RAM中DATA為起始地址的數(shù)據(jù)塊中連續(xù)10個無符號數(shù)相加 并把和送到SUM單元 設(shè)其和小于256 ORG1000HSTART MOVR2 0AH 數(shù)據(jù)塊長度10送計數(shù)器R2MOVR0 DATA 數(shù)據(jù)塊起始地址送指針R0CLRA 累加器清零LOOP ADDA R0 累加部分和INCR0DJNZR2 LOOP 若R2 1 0則轉(zhuǎn)LOOP繼續(xù)MOVSUM A 存累加和SJMP 停機END這是一個循環(huán)結(jié)構(gòu)的程序 DJNZ指令又是決定整個循環(huán)是否結(jié)束的控制語句 89 3 6 3子程序調(diào)用和返回指令 一 子程序調(diào)用指令 1 短調(diào)用指令A(yù)CALLaddr112 長調(diào)用指令LCALLaddr16 二 返回指令 1 子程序返回RET2 中斷返回RETI 90 1 調(diào)用指令 1 短調(diào)用指令A(yù)CALLaddr11PC 2 PCSP 1 SP PC7 0 SP SP 1 SP PC15 8 SP addr11 PC10 02 長調(diào)用指令LCALLaddr16PC 3 PCSP 1 SP PC7 0 SP SP 1 SP PC15 8 SP addr16 PC 子程序的調(diào)用包含兩部分內(nèi)容 A 實現(xiàn)轉(zhuǎn)入子程序的入口地址 這主要由調(diào)用語句中的addr11或addr16實現(xiàn) B 子程序完成后 能夠自動的返回 這是由調(diào)用語句執(zhí)行時依靠堆棧操作已經(jīng)將返回地址壓棧保存 帶返回時彈出送PC實現(xiàn)的 91 2 返回指令 格式 RET 子程序返回操作碼 22H 操作 SP PC15 8 SP 1 SP SP PC7 0 SP 1 SP格式 RETI 中斷子程序返回操作碼 32H 操作 SP PC15 8 SP 1 SP SP PC7 0 SP 1 SPRETI與RET的區(qū)別在于返回主程序后 RETI還要清除相應(yīng)的中斷優(yōu)先級狀態(tài)位 使系統(tǒng)響應(yīng)低優(yōu)先級的中斷 92 3 6 4空操作指令 格式 NOP 單字節(jié)操作碼 00H 功能 僅使程序計數(shù)器PC加一 消耗12個時鐘周期 所以時常用作延時 93 位操作特點 操作數(shù)不是字節(jié) 而是某一位 每位的取值只能是 0 或 1 因而也稱之為布爾變量操作 布爾變量存在于片內(nèi)RAM的位尋址區(qū) 20H 2FH 11個可以按位尋址的SFR 3 7位操作指令 主要內(nèi)容 1 位傳送指令2 位置位和位清零指令3 位運算指令4 位控制轉(zhuǎn)移指令 94 3 7 1位傳送指令 格式 MOVC bit 其中 C為PSW中的CyMOVbit C bit為布爾變量的位地址舉例 試將00H位和7FH位中的內(nèi)容互換 解 兩個位互換必須找一個位作為緩沖位 MOVC 00HMOV01H CMOVC 7FHMOV00H CMOVC 01HMOV7FH C 例如 若 CY 1 P3 11000101B P1 00110101B 執(zhí)行以下指令 MOVP1 3 CMOVC P3 3MOVP1 2 C結(jié)果為 CY 0 P3的內(nèi)容未變 P1的內(nèi)容變?yōu)?0111001B 95 96 3 7 2位置位和位清零指令 格式 CLRC 0 CyCLRbit 0 bit SETBC 1 CySETBbit 1 bit 例如 若 P1 10011101B 執(zhí)行指令 CLRP1 3 后 結(jié)果為 P1 10010101B 執(zhí)行指令 SETBP1 1 后 結(jié)果為 P1 10011111B 97 3 7 3位邏輯運算指令 格式 ANLC bit C bit CANLC bit C bit CORLC bit C bit CORLC bit C bit CCPLC C CCPLbit bit bit 98 3 7 4位控制轉(zhuǎn)移指令 一 以Cy內(nèi)容為條件的轉(zhuǎn)移指令格式 JCrel 若Cy 1 則PC 2 rel PC 若Cy 0 則PC 2 PCJNCrel 若Cy 0 則PC 2 rel PC 若Cy 1 則PC 2 PC 二 以位地址為內(nèi)容為條件的轉(zhuǎn)移指令格式 JBbit rel 若 bit 1 則PC 3 rel PC 若 bit 0 則PC 3 PCJNBbit rel 若 bit 0 則PC 3 rel PC 若 bit 1 則PC 3 PCJBCbit rel 若 bit 1 則PC 3 rel PC 0 bit 若 bit 0 則PC 3 PC 99 位操作指令應(yīng)用舉例 已知 內(nèi)部RAM的M1 M2單元各有兩個無符號的8位數(shù) 試編程比較其大小 并將大數(shù)送MAX單元 解 MOVA M1 操作數(shù)1送累加器ACJNEA M2 LOOP 兩個數(shù)相比較LOOP JNCLOOP1 M1 M2時轉(zhuǎn)LOOP1MOVA M2 M1 M2時 取M2到ALOOP1 MOVMAX A A中數(shù)據(jù)送MAX單元說明 1 第2條指令作為比較指令使用 不論結(jié)果都轉(zhuǎn)LOOP2 第3條指令是一條位控轉(zhuǎn)移指令 根據(jù)Cy的狀態(tài)控制轉(zhuǎn)移 本章小結(jié) 指令系統(tǒng)的功能強弱決定了計算機性能的高低 80C51單片機的指令系統(tǒng)共有111條指令 其指令執(zhí)行時間短 指令字節(jié)少 位操作指令極為豐富 指令由操作碼和操作數(shù)組成 操作碼用來規(guī)定要執(zhí)行的操作的性質(zhì) 操作數(shù)用于給指令的操作提供數(shù)據(jù)和地址 8051的指令按其編碼長短可以分為3種格式 單字節(jié)指令 雙字節(jié)指令和三字節(jié)指令 尋址方式是尋找存放操作數(shù)的地址并將其提取出來的方法 8051單片機有7種基本的尋址方式 寄存器尋址 直接尋址 寄存器間接尋址 立即尋址 變址尋址 相對尋址和位尋址 100 數(shù)據(jù)傳送類指令在單片機中應(yīng)用最為頻繁 其特點是執(zhí)行的結(jié)果不影響標(biāo)志位的狀態(tài) 算術(shù)運算類指令的特點是執(zhí)行的結(jié)果通常影響標(biāo)志位的狀態(tài) 邏輯運算類指令執(zhí)行的結(jié)果一般不影響標(biāo)志位CY AC和OV 僅在涉及累加器A時才對標(biāo)志位P產(chǎn)生影響 控制程序的轉(zhuǎn)移要利用轉(zhuǎn)移指令 8051的轉(zhuǎn)移指令有無條件轉(zhuǎn)移 條件轉(zhuǎn)移及子程序調(diào)用與返回等 位操作具有較強的位處理能力 在進(jìn)行位操作時 以進(jìn)位標(biāo)志CY作為位累加器 101 思考題與習(xí)題 1 80C51系列單片機的指令系統(tǒng)有何特點 2 80C51單片機有哪幾種尋址方式 各尋址方式所對應(yīng)的寄存器或存儲器空間如何 3 對于80C52單片機內(nèi)部RAM還存在高128字節(jié) 應(yīng)采用何種方式訪問 4 試用位操作指令實現(xiàn)下列邏輯操作 要求不得改變未涉及的位的內(nèi)容 1 使ACC 0置位 2 清除累加器高4位 3 清除ACC 3 ACC 4 ACC 5 ACC 6 102 5 試編寫程序 將內(nèi)部RAM的20H 21H 22H三個連續(xù)單元的內(nèi)容依次存入2FH 2EH和2DH單元 6 試編寫程序 完成兩個16位數(shù)的減法 7F4DH 2B4EH 結(jié)果存入內(nèi)部RAM的30H和31H單元 31H單元存差的高8位 30H單元存差的低8位 7 試編寫程序 將R1中的低4位數(shù)與R2中的高4位數(shù)合并成一個8位數(shù) 并將其存放在R1中 8 試編寫程序 將內(nèi)部RAM的20H 21H單元的兩個無符號數(shù)相乘 結(jié)果存放在R2 R3中 R2中存放高8位 R3中存放低8位 103- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 單片機 指令系統(tǒng)
鏈接地址:http://www.3dchina-expo.com/p-6352900.html