單片機(jī)的指令系統(tǒng).ppt
《單片機(jī)的指令系統(tǒng).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《單片機(jī)的指令系統(tǒng).ppt(103頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1 指令概述尋址方式數(shù)據(jù)傳送類指令算術(shù)運(yùn)算類指令邏輯操作類指令控制轉(zhuǎn)移類指令位操作指令 第3章80C51的指令系統(tǒng) 本章內(nèi)容 2 3 1指令系統(tǒng)簡介 1 指令概述一臺(tái)微機(jī)所具有的所有指令的集合 就構(gòu)成了指令系統(tǒng) 指令系統(tǒng)越豐富 說明CPU的功能越強(qiáng) 2 機(jī)器指令一臺(tái)微機(jī)能執(zhí)行什么樣的操作 是在微機(jī)設(shè)計(jì)時(shí)確定的 一條指令對(duì)應(yīng)著一種基本操作 由于計(jì)算機(jī)只能識(shí)別二進(jìn)制數(shù) 所以指令也必須用二進(jìn)制形式來表示 稱為指令的機(jī)器碼或機(jī)器指令 MCS 51單片機(jī)指令系統(tǒng)共有33種功能 42種助記符 111條指令 3 1 二進(jìn)制的表示形式 以 累加器的內(nèi)容 08H 為例 00100100B操作碼OP 加法 00001000B操作數(shù)DATA 08H 特點(diǎn) 能被CPU直接識(shí)別 運(yùn)行的形式 也稱機(jī)器碼 匯編語言的目標(biāo)代碼 缺點(diǎn) 不便于閱讀 記憶和調(diào)試修改 3 指令表示 4 2 十六進(jìn)制表示方式 它是對(duì)二進(jìn)制形式的一種簡化 00100100B24H00001000B08H 二進(jìn)制表示的形式十六進(jìn)制表示的形式 在實(shí)驗(yàn)室等少數(shù)環(huán)境下 可以將這種形式作為輸入程序的一種輔助手段 但是 這種形式的指令格式必須由對(duì)應(yīng)的監(jiān)控程序把它們翻譯成二進(jìn)制的 機(jī)器碼 后存入程序存儲(chǔ)器并運(yùn)行 5 3 指令的 助記符 方式 也稱 匯編格式 00100100B24H00001000B08HADDA 08H 二進(jìn)制表示形式十六進(jìn)制表示匯編格式 返回 1 這是一種由英文單詞或字母 數(shù)字來表征指令功能的形式 是一種便于閱讀 書寫和交流的表示形式 2 匯編 格式的指令必須 翻譯 為二進(jìn)制形式 機(jī)器碼 后才能為CPU所識(shí)別和執(zhí)行 3 三種不同的表示方法適用于不同的場(chǎng)合 6 指令格式 既指令的結(jié)構(gòu)形式 操作碼 操作數(shù)或操作數(shù)地址 由操作碼和操作數(shù) 或操作數(shù)地址 構(gòu)成指令的結(jié)構(gòu) 舉例 MOVA 0FFHADDA R0 返回 4 指令格式 7 采用助記符表示的匯編語言指令格式如下 標(biāo)號(hào)是程序員根據(jù)編程需要給指令設(shè)定的符號(hào)地址 可有可無 標(biāo)號(hào)由1 8個(gè)字符組成 第一個(gè)字符必須是英文字 不能是數(shù)字或其它符號(hào) 標(biāo)號(hào)后必須用冒號(hào) 4 指令格式 8 操作碼表示指令的操作種類 如MOV表示數(shù)據(jù)傳送操作 ADD表示加法操作等 操作數(shù)或操作數(shù)地址表示參加運(yùn)算的數(shù)據(jù)或數(shù)據(jù)的有效地址 操作數(shù)一般有以下幾種形式 沒有操作數(shù)項(xiàng) 操作數(shù)隱含在操作碼中 如RET指令 只有一個(gè)操作數(shù) 如CPLA指令 有兩個(gè)操作數(shù) 如MOVA 00H指令 操作數(shù)之間以逗號(hào)相隔 有三個(gè)操作數(shù) 如CJNEA 00H NEXT指令 操作數(shù)之間也以逗號(hào)相隔 注釋是對(duì)指令的解釋說明 用以提高程序的可讀性 注釋前必須加分號(hào) 4 指令格式 9 在MCS 51單片機(jī)的指令系統(tǒng)中 因指令操作碼和操作數(shù)的不同 指令 在存儲(chǔ)器中 長度也各不相同 分為單字節(jié) 雙字節(jié)和三字節(jié) 單字節(jié)指令 49條 分無操作數(shù) 有操作數(shù)兩種 無操作數(shù) 如INCDPTR10100011BINCA00000100B 特點(diǎn) 操作數(shù)隱含在操作碼中 含有操作數(shù)寄存器名稱的單字節(jié)指令 如 MOVA R011101000BMOVA R111101001B 特點(diǎn) 寄存器名以三位數(shù)代碼的形式在指令的后三位 5 指令長度與執(zhí)行時(shí)間 5 指令長度與執(zhí)行時(shí)間 10 雙字節(jié)指令 46條 指令的操作碼和操作數(shù)各占一個(gè)字節(jié) 如 MOVA data01110100Bdata很明顯 8位的操作數(shù)本身占據(jù)一個(gè)字節(jié) n n 1 MOVA data 雙字節(jié)指令在程序存儲(chǔ)器的存放示意圖 5 指令長度與執(zhí)行時(shí)間 11 三字節(jié)指令 16條 指令中的操作數(shù)為雙字節(jié) 如 MOVDPTR data161001000B data15 8 data7 0或者 指令中分別包含1個(gè)字節(jié)的操作數(shù)和1個(gè)字節(jié)的操作數(shù)地址 如 MOVdirect data舉例 MOV20H 0FFH MOVDPTR data16 MOVdirect data 三字節(jié)指令在存儲(chǔ)器中存放的方式示意圖 5 指令長度與執(zhí)行時(shí)間 12 指令的字節(jié)多是否意味著指令周期就長 從表中可見 指令的字節(jié)數(shù)與指令周期不是對(duì)等的關(guān)系 返回 5 指令長度與執(zhí)行時(shí)間 5 指令長度與執(zhí)行時(shí)間 13 6 符號(hào)說明 參見P51說明 14 3 2尋址方式 找到參與運(yùn)算的數(shù)據(jù)或數(shù)據(jù)所在的地址的方式 稱為尋址方式 尋址方式主要是指源操作數(shù)的尋址 15 目的地 XXH 操作數(shù) MOVP1 55H MOVA 01H 55H 目的地 信 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對(duì)尋址 位尋址 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單片機(jī)中 可以直接尋址的存儲(chǔ)器主要有內(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ù)尋址 寄存器間接尋址 變址尋址 相對(duì)尋址 位尋址 設(shè)R0 3AH 內(nèi)部RAM3AH中的值是65H 則指令MOVA R0的執(zhí)行結(jié)果是累加器A的值為65H 目的地 寄存器 操作數(shù) 3AH 內(nèi)部RAM 3AH 65H 3AH R0R1DPTR 目的地 2號(hào) 信在2號(hào)箱子里 1號(hào) 注意 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ù)尋址 寄存器間接尋址 變址尋址 相對(duì)尋址 位尋址 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ù)尋址 寄存器間接尋址 變址尋址 相對(duì)尋址 XXH 位尋址 操作數(shù) ORG2000HSJMP54HSJMP2056H出現(xiàn)的格式 PC 54H PC 2002H 2002H 2056H PC 2056H 6 相對(duì)尋址 27 設(shè)指令SJMP54H的機(jī)器碼80H54H存放在2000H處 當(dāng)執(zhí)行到該指令時(shí) 先從2000H和2001H單元取出指令 PC自動(dòng)變?yōu)?002H 再把PC的內(nèi)容與操作數(shù)54H相加 形成目標(biāo)地址2056H 再送回PC 使得程序跳轉(zhuǎn)到2056H單元繼續(xù)執(zhí)行 28 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對(duì)尋址 位尋址 1 00000000 想一想 如果想使27H單元的第3位置1 該怎么辦呢 7 位尋址 29 位尋址地址表 例 SETB3DH 3D 3C 3B 3F 3E 3A 39 38 27H 30 寄存器尋址 直接尋址 立即數(shù)尋址 寄存器間接尋址 變址尋址 相對(duì)尋址 位尋址 SETB3DH 0000000 1 0 位地址的表示方式 31 3 3數(shù)據(jù)傳送指令 按功能 MCS 51指令系統(tǒng)可分為下列5類 數(shù)據(jù)傳送指令 29條 算術(shù)運(yùn)算指令 24條 邏輯運(yùn)算指令 24條 控制轉(zhuǎn)移指令 17條 位操作指令 17條 32 數(shù)據(jù)傳送類指令共29條 它是指令系統(tǒng)中最活躍 使用最多的一類指令 一般的操作是把源操作數(shù)傳送到目的操作數(shù) 即指令執(zhí)行后目的操作數(shù)改為源操作數(shù) 而源操作數(shù)保持不變 若要求在進(jìn)行數(shù)據(jù)傳送時(shí) 不丟失目的操作數(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的值時(shí) 奇偶標(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í)將立即數(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中的某一個(gè)寄存器 指令中Rn在內(nèi)部數(shù)據(jù)存儲(chǔ)器中的地址由當(dāng)前的工作寄存器區(qū)選擇位RS1 RS0確定 可以是00H 07H 08H 0FH 10H 17H 18H 1FH 例如 MOVR0 A 若當(dāng)前RS1 RS0設(shè)置為00 即工作寄存器0區(qū) 執(zhí)行該指令時(shí) 將累加器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是單片機(jī)內(nèi)部SFR中的兩個(gè)寄存器DPH DPL組合而成 其中DPH為高八位 DPL為低八位 DPTR是一個(gè)專門用于訪問外部存儲(chǔ)器的間址寄存器 尋址能力為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 實(shí)現(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單元有一個(gè)數(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 停機(jī)END 返回 42 3 3 3數(shù)據(jù)交換指令 為提供一種方便的累加器和寄存器或RAM之間的數(shù)據(jù)交換 避免了使用一般MOV傳送指令完成交換時(shí)的不便 格式 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中建立一個(gè)數(shù)據(jù)表 可以使用DPTR PC作為數(shù)據(jù)表格的基地址 在第一條指令中 用DPTR作為基地址 使用前 先將數(shù)據(jù)表的首地址送入DPTR中 累加器A作為偏移量 由兩者數(shù)據(jù)相加得到待查的表中數(shù)據(jù)地址并取出 遠(yuǎn)程查表指令 第二條指令是以程序計(jì)數(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ù)傳送指令 堆棧 一個(gè)用來保存程序斷點(diǎn) 數(shù)據(jù)的特殊的存儲(chǔ)區(qū)域 在MCS 51單片機(jī)中 棧區(qū)是占用片內(nèi)RAM的存儲(chǔ)空間 具體棧位置由指針SP來確定 系統(tǒng)上電時(shí) SP 07H 1 進(jìn)棧操作 PUSHdirect SP 1 SP direct SP 2 出棧操作 POPdirect SP direct SP 1 SP 注意 尋址方式為直接尋址 所以PUSHA是錯(cuò)誤的 應(yīng)當(dāng)是PUSHACC或PUSH0E0H 同理 PUSHR0也是錯(cuò)誤的 進(jìn)棧是堆棧向上 生長 的過程 即SP 1 出棧則相反 系統(tǒng)上電時(shí) SP 07h SP的值可以根據(jù)需要進(jìn)行修改 以適應(yīng)具體編程的需要 在確定棧區(qū)位置時(shí)要考慮對(duì)數(shù)據(jù)區(qū)的影響 以避免數(shù)據(jù)區(qū)與棧區(qū)沖突 47 堆棧操作指令舉例 一 下面是一個(gè)BCD碼轉(zhuǎn)換為二進(jìn)制的子程序BCDB中有關(guān)堆棧操作的例子 在這里 進(jìn)棧操作是為了保護(hù)主程序中相關(guān)寄存器中的數(shù)據(jù) 因?yàn)樽映绦蛞褂眠@些寄存器 org0800hbcdb pushPSWpushACCpushB popBpopACCpopPSWRET SP 48 堆棧操作指令舉例 二 堆棧操作指令除了可以在子程序的設(shè)計(jì)中 對(duì)主程序的數(shù)據(jù)進(jìn)行保護(hù) 還可以根據(jù)堆棧操作的特點(diǎn)完成一些特殊的操作 舉例 設(shè)片內(nèi)RAM的30h單元存有x 40h單元存有y 試將兩個(gè)單元內(nèi)容互換 push30hpush40hpop30hpop40h SP 07h 40h 30h 49 內(nèi)部RAM前128字節(jié) SFR之間可以相互傳送 但最多只允許1個(gè)操作數(shù)使用寄存器間接尋址 MOV R0 R1是錯(cuò)誤的 訪問SFR必須使用直接尋址 不能采用寄存器間接尋址 MOVA P0或MOVA 80H正確MOVR0 80H和MOVA R0錯(cuò)誤 8051沒有提供B寄存器的尋址方式 乘法除法除外 MOVA B直接尋址 注意A和ACC的區(qū)別 MOV3FH A 寄存器尋址 2字節(jié)指令 MOV3FH ACC 直接尋址 3字節(jié)指令 8051數(shù)據(jù)傳送指令的幾點(diǎn)說明 50 3 4算術(shù)運(yùn)算指令 不帶進(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 參加運(yùn)算的數(shù)據(jù)都應(yīng)當(dāng)是8位的 結(jié)果也是8位并影響PSW 2 根據(jù)編程者的需要 8位數(shù)據(jù)可以是無符號(hào)數(shù) 0 255 也可以是有符號(hào)數(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ù)都是無符號(hào)數(shù) 則因Cy 0無進(jìn)位 25 102 127 2 若兩個(gè)數(shù)是有符號(hào)數(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ù)是無符號(hào)數(shù) 因Cy 0無進(jìn)位 90 107 1972 若兩數(shù)是有符號(hào)數(shù) 因OV 1 故有溢出 兩個(gè)正數(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 對(duì)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 除了第一條對(duì)PSW的P有影響外 其余對(duì)PSW均無影響 2 由于上面的原因 INC指令不能作為一般的數(shù)據(jù)算術(shù)運(yùn)算使用 INC主要用于修改數(shù)據(jù)指針等控制 循環(huán)語句中使用 56 編程舉例 已知M1 M2單元中存有兩個(gè)16位無符號(hào)數(shù)x1 x2 低位在前 試寫出x1 x2 并將結(jié)果放入M1 M1 1單元 低8位在M1單元 設(shè)兩數(shù)之和不會(huì)超過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單片機(jī)的指令系統(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手工計(jì)算 60 2 減一指令 格式 DECA 累加器A減一DECRn Rn 1 RnDECdirect 內(nèi)存單元數(shù)據(jù)減一DEC Ri 內(nèi)存單元數(shù)據(jù)減一 注意 1 除了第一條對(duì)PSW的P有影響外 其余對(duì)PSW均無影響 2 由于上面的原因 DEC指令一般不作為數(shù)據(jù)算術(shù)運(yùn)算使用 因?yàn)椴荒軐?duì)PSW的OV等位產(chǎn)生影響 它主要用于修改數(shù)據(jù)指針在控制 循環(huán)語句中使用 61 3 4 3十進(jìn)制調(diào)整指令 在CPU進(jìn)行BCD碼運(yùn)算時(shí) 必須在運(yùn)算后進(jìn)行十進(jìn)制調(diào)整 這是因?yàn)?CPU在運(yùn)算時(shí) 并不知道數(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加法運(yùn)算 試寫出完成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單片機(jī)唯一的一類單字節(jié)4周期指令 它相當(dāng)于4條加法指令的運(yùn)行時(shí)間 格式 MULAB a b b a b存高8位 a存低8位 DIVAB a b a b a存商 b存余數(shù) 注意 指令對(duì)標(biāo)志的影響 1 在乘法指令中對(duì)PSW的影響有Cy OV 和P 具體如下 Cy 0 P取決于A中 1 的個(gè)數(shù) OV表明積的大小 當(dāng)積超過255 B 0 時(shí) OV 1 2 在除法指令中 Cy P與乘法相同 在執(zhí)行除法指令時(shí) 若B 0時(shí)OV 1 表示除數(shù) 0除法無意義 其余情況下OV被復(fù)位 64 3 5邏輯運(yùn)算指令 功能 對(duì)2個(gè)8位二進(jìn)制數(shù)進(jìn)行邏輯與 或 非和異或操作 特點(diǎn) 除了以累加器A為目標(biāo)寄存器的指令影響PSW的P位外 其余指令對(duì)PSW均無影響 1 邏輯與運(yùn)算指令 ANL 2 邏輯或運(yùn)算指令 ORL 3 邏輯異或指令 XRL 4 累加器清零和取反指令 CLR CPL 65 1 邏輯與運(yùn)算指令 格式 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)寄存器的邏輯運(yùn)算指令 2 以內(nèi)存單元為目標(biāo)的邏輯運(yùn)算指令 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操作可以從某個(gè)存儲(chǔ)單元中取出某幾位 而把其它的位清零 67 2 邏輯或運(yùn)算指令 格式 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同與運(yùn)算一樣 上面的指令也可以分為兩類 1 以累加器A為目標(biāo)寄存器的邏輯運(yùn)算指令 2 以內(nèi)存單元為目標(biāo)的邏輯運(yùn)算指令 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é) 與運(yùn)算可以 清零 某些位 或運(yùn)算可以 置位 某些位 69 3 邏輯異或運(yùn)算指令 格式 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特點(diǎn) 按位運(yùn)算 相同時(shí)為0 不同時(shí)為1 使用異或可以實(shí)現(xiàn)將某個(gè)字節(jié)的數(shù)據(jù)或?qū)?shù)據(jù)的某幾位取反 70 舉例 已知 外部RAM的30H單元中有一個(gè)數(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 累加器清零和取反指令 用傳送指令可以實(shí)現(xiàn)對(duì)累加器A的清零和取反操作 但是它們都是雙字節(jié)指令 在MCS 51的指令系統(tǒng)中專門設(shè)計(jì)了單字節(jié) 單周期對(duì)累加器清零和取反的指令 格式 CLRA 累加器清零CPLA 累加器取反取反指令可以方便的實(shí)現(xiàn)求補(bǔ)操作 舉例 已知30H單元中有一個(gè)數(shù)x 寫出對(duì)它求補(bǔ)的程序 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)指令可以實(shí)現(xiàn)數(shù)據(jù)各位的循環(huán)移位 循環(huán)檢測(cè) 也可以對(duì)數(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 相對(duì)轉(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í)行時(shí) 將指令碼中的addr16送入PC中 使程序無條件的轉(zhuǎn)向addr16所指向的新地址執(zhí)行程序 舉例 已知某單片機(jī)的監(jiān)控程序地址為A080H 試問用什么方法使單片機(jī)開機(jī)后自動(dòng)的轉(zhuǎn)向該監(jiān)控程序 解 因?yàn)閱纹瑱C(jī)上電時(shí) 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程序計(jì)數(shù)器 78 MCS 51的ROM系統(tǒng)是以2K為一頁來劃分程序存儲(chǔ)器 這樣對(duì)于4K的片內(nèi)ROM存儲(chǔ)器可以分為2頁 片外64K的ROM可以分為32頁 在執(zhí)行AJMP指令時(shí) 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)移將會(huì)出現(xiàn)錯(cuò)誤 79 ROM的64K存儲(chǔ)空間的頁面 部分 劃分表 80 ROM的64K存儲(chǔ)空間的頁面示意圖 AAA MOVA R0MOVR1 A AJMPAAA 0100H 07FEH 00000111111111111110 PC值 00001000000000000000 PC 2值 00001001000000000000 AJMP指令中的11位地址 原本AJMP指令要轉(zhuǎn)到本頁的0100H單元但是由于PC的高5位頁面地址發(fā)生了變化使AJMP指令實(shí)際轉(zhuǎn)到下一頁0900H單元 最后PC值 發(fā)生跨頁錯(cuò)誤 81 AJMP轉(zhuǎn)一指令是用來做頁內(nèi)2K范圍的轉(zhuǎn)移 如果使用不當(dāng) 會(huì)發(fā)生錯(cuò)誤的 跨頁 操作 產(chǎn)生跨頁的原因是AJMP指令處于每一頁的最后兩個(gè)單元的結(jié)果 所以避免這種現(xiàn)象的方法就是不要在每一頁的最后兩個(gè)單元使用AJMP指令 如果目標(biāo)地址與AJMP地址不再同一頁內(nèi) 建議使用LJMP指令替代AJMP 使用AJMP指令時(shí) 11位的絕對(duì)地址可以用符號(hào)地址取代 正確使用AJMP轉(zhuǎn)移指令 82 3 相對(duì)轉(zhuǎn)移SJMP指令 格式 SJMPrelrel為偏移量 127 128 rel 偏移量 的計(jì)算公式 rel 目標(biāo)地址 源地址 2 其中 2為SJMP指令的長度 例1 如圖 要轉(zhuǎn)到0116H時(shí) rel 0116H 0110H 2 04H 例2 要轉(zhuǎn)到0109H時(shí) rel 0109H 0110H 2 F7H 9 實(shí)際編程時(shí) 使用符號(hào)地址取代rel以簡化計(jì)算 在匯編時(shí)由匯編程序來計(jì)算rel PC PC 2 0109H 0110H 0116H 83 4 間接轉(zhuǎn)移指令 散轉(zhuǎn)指令 格式 JMP A DPTR單字節(jié)操作碼為73H特點(diǎn) 轉(zhuǎn)移地址由累加器A的內(nèi)容與DPTR相加形成 用途 用來制作一個(gè)多分支的轉(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時(shí) PC 3 PC Cy 0CJNEA data rela data時(shí) 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é) 指令本身先做一個(gè)帶回送的減一運(yùn)算操作 然后根據(jù)運(yùn)算的結(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個(gè)無符號(hào)數(shù)相加 并把和送到SUM單元 設(shè)其和小于256 ORG1000HSTART MOVR2 0AH 數(shù)據(jù)塊長度10送計(jì)數(shù)器R2MOVR0 DATA 數(shù)據(jù)塊起始地址送指針R0CLRA 累加器清零LOOP ADDA R0 累加部分和INCR0DJNZR2 LOOP 若R2 1 0則轉(zhuǎn)LOOP繼續(xù)MOVSUM A 存累加和SJMP 停機(jī)END這是一個(gè)循環(huán)結(jié)構(gòu)的程序 DJNZ指令又是決定整個(gè)循環(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 實(shí)現(xiàn)轉(zhuǎn)入子程序的入口地址 這主要由調(diào)用語句中的addr11或addr16實(shí)現(xiàn) B 子程序完成后 能夠自動(dòng)的返回 這是由調(diào)用語句執(zhí)行時(shí)依靠堆棧操作已經(jīng)將返回地址壓棧保存 帶返回時(shí)彈出送PC實(shí)現(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)先級(jí)狀態(tài)位 使系統(tǒng)響應(yīng)低優(yōu)先級(jí)的中斷 92 3 6 4空操作指令 格式 NOP 單字節(jié)操作碼 00H 功能 僅使程序計(jì)數(shù)器PC加一 消耗12個(gè)時(shí)鐘周期 所以時(shí)常用作延時(shí) 93 位操作特點(diǎn) 操作數(shù)不是字節(jié) 而是某一位 每位的取值只能是 0 或 1 因而也稱之為布爾變量操作 布爾變量存在于片內(nèi)RAM的位尋址區(qū) 20H 2FH 11個(gè)可以按位尋址的SFR 3 7位操作指令 主要內(nèi)容 1 位傳送指令2 位置位和位清零指令3 位運(yùn)算指令4 位控制轉(zhuǎn)移指令 94 3 7 1位傳送指令 格式 MOVC bit 其中 C為PSW中的CyMOVbit C bit為布爾變量的位地址舉例 試將00H位和7FH位中的內(nèi)容互換 解 兩個(gè)位互換必須找一個(gè)位作為緩沖位 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位邏輯運(yùn)算指令 格式 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單元各有兩個(gè)無符號(hào)的8位數(shù) 試編程比較其大小 并將大數(shù)送MAX單元 解 MOVA M1 操作數(shù)1送累加器ACJNEA M2 LOOP 兩個(gè)數(shù)相比較LOOP JNCLOOP1 M1 M2時(shí)轉(zhuǎn)LOOP1MOVA M2 M1 M2時(shí) 取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)的功能強(qiáng)弱決定了計(jì)算機(jī)性能的高低 80C51單片機(jī)的指令系統(tǒng)共有111條指令 其指令執(zhí)行時(shí)間短 指令字節(jié)少 位操作指令極為豐富 指令由操作碼和操作數(shù)組成 操作碼用來規(guī)定要執(zhí)行的操作的性質(zhì) 操作數(shù)用于給指令的操作提供數(shù)據(jù)和地址 8051的指令按其編碼長短可以分為3種格式 單字節(jié)指令 雙字節(jié)指令和三字節(jié)指令 尋址方式是尋找存放操作數(shù)的地址并將其提取出來的方法 8051單片機(jī)有7種基本的尋址方式 寄存器尋址 直接尋址 寄存器間接尋址 立即尋址 變址尋址 相對(duì)尋址和位尋址 100 數(shù)據(jù)傳送類指令在單片機(jī)中應(yīng)用最為頻繁 其特點(diǎn)是執(zhí)行的結(jié)果不影響標(biāo)志位的狀態(tài) 算術(shù)運(yùn)算類指令的特點(diǎn)是執(zhí)行的結(jié)果通常影響標(biāo)志位的狀態(tài) 邏輯運(yùn)算類指令執(zhí)行的結(jié)果一般不影響標(biāo)志位CY AC和OV 僅在涉及累加器A時(shí)才對(duì)標(biāo)志位P產(chǎn)生影響 控制程序的轉(zhuǎn)移要利用轉(zhuǎn)移指令 8051的轉(zhuǎn)移指令有無條件轉(zhuǎn)移 條件轉(zhuǎn)移及子程序調(diào)用與返回等 位操作具有較強(qiáng)的位處理能力 在進(jìn)行位操作時(shí) 以進(jìn)位標(biāo)志CY作為位累加器 101 思考題與習(xí)題 1 80C51系列單片機(jī)的指令系統(tǒng)有何特點(diǎn) 2 80C51單片機(jī)有哪幾種尋址方式 各尋址方式所對(duì)應(yīng)的寄存器或存儲(chǔ)器空間如何 3 對(duì)于80C52單片機(jī)內(nèi)部RAM還存在高128字節(jié) 應(yīng)采用何種方式訪問 4 試用位操作指令實(shí)現(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三個(gè)連續(xù)單元的內(nèi)容依次存入2FH 2EH和2DH單元 6 試編寫程序 完成兩個(gè)16位數(shù)的減法 7F4DH 2B4EH 結(jié)果存入內(nèi)部RAM的30H和31H單元 31H單元存差的高8位 30H單元存差的低8位 7 試編寫程序 將R1中的低4位數(shù)與R2中的高4位數(shù)合并成一個(gè)8位數(shù) 并將其存放在R1中 8 試編寫程序 將內(nèi)部RAM的20H 21H單元的兩個(gè)無符號(hào)數(shù)相乘 結(jié)果存放在R2 R3中 R2中存放高8位 R3中存放低8位 103- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 單片機(jī) 指令系統(tǒng)
鏈接地址:http://m.zhongcaozhi.com.cn/p-6352900.html