MCS-51系列單片機(jī)的指令系統(tǒng).ppt
《MCS-51系列單片機(jī)的指令系統(tǒng).ppt》由會員分享,可在線閱讀,更多相關(guān)《MCS-51系列單片機(jī)的指令系統(tǒng).ppt(91頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1 第3章MCS 51系列單片機(jī)的指令系統(tǒng) 3 1指令系統(tǒng)簡介3 2尋址方式3 3數(shù)據(jù)傳送類指令3 4算術(shù)運(yùn)算類指令3 5邏輯運(yùn)算及移位類指令3 6控制轉(zhuǎn)移類指令3 7位操作類指令 2 3 1指令系統(tǒng)概述 指令是規(guī)定計(jì)算機(jī)進(jìn)行某種操作的命令 一臺計(jì)算機(jī)所能執(zhí)行的指令集合稱為該計(jì)算機(jī)的指令系統(tǒng) 3 1 1指令概述計(jì)算機(jī)內(nèi)部只識別二進(jìn)制數(shù) 因此 能被計(jì)算機(jī)直接識別 執(zhí)行的指令是使用二進(jìn)制編碼表示的指令 這種指令被稱為機(jī)器語言指令 MCS 51系列單片機(jī)指令系統(tǒng)共有111條指令 按功能劃分 可分為五大類 1 數(shù)據(jù)傳送類指令 29條 2 算術(shù)運(yùn)算類指令 24條 3 邏輯運(yùn)算及移位類指令 24條 4 控制轉(zhuǎn)移類指令 17條 5 位操作類指令 17條 3 3 1 2指令格式一條完整的指令格式如下 標(biāo)號 操作碼 操作數(shù) 注釋 標(biāo)號 標(biāo)號是該指令的起始地址 是一種符號地址 標(biāo)號可以由1 8個字符組成 第一個字符必須是字母 其余字符可以是字母 數(shù)字或其他特定符號 標(biāo)號后跟分界符 操作碼 指令的助記符 它規(guī)定了指令所能完成的操作功能 操作數(shù) 指出了指令的操作對象 操作數(shù)可以是一個具體的數(shù)據(jù) 也可以是存放數(shù)據(jù)的單元地址 還可以是符號常量或符號地址等 多個操作數(shù)之間用逗號 分隔 注釋 為了方便閱讀而添加的解釋說明性的文字 用 開頭 4 3 1 3指令中常用符號說明Rn 當(dāng)前選中的工作寄存器組中的寄存器R0 R7之一 所以n 0 7 Ri 當(dāng)前選中的工作寄存器組中可作地址指針的寄存器R0 R1 所以i 0 1 data 8位立即數(shù) data16 16位立即數(shù) direct 內(nèi)部RAM的8位地址 即可以是內(nèi)部RAM的低128個單元地址 也可以是特殊功能寄存器的單元地址或符號 在指令中direct表示直接尋址方式 addr11 11位目的地址 只限于在ACALL和AJMP指令中使用 addr16 16位目的地址 只限于在LCALL和LJMP指令中使用 5 rel 補(bǔ)碼形式表示的8位地址偏移量 在相對轉(zhuǎn)移指令中使用 bit 表示片內(nèi)RAM位尋址區(qū)或可位尋址的特殊功能寄存器的位地址 間接尋址方式中間址寄存器的前綴標(biāo)志 C 進(jìn)位標(biāo)志位 它是布爾處理機(jī)的累加器 也稱之為位累加器 加在位地址的前面 表示對該位先求反再參與操作 但不影響該位的值 x 由x指定的寄存器或地址單元中的內(nèi)容 x 由x所指寄存器的內(nèi)容作為地址的存儲單元的內(nèi)容 表示本條指令的起始地址 表示指令操作流程 將箭頭右邊的內(nèi)容送到箭頭左邊的單元中 6 3 2尋址方式 尋址就是尋找操作數(shù)的地址 尋址方式則指出尋找操作數(shù)地址的方式方法 MCS 51系列單片機(jī)提供了七種尋址方式 3 2 1立即尋址所謂立即尋址就是在指令中直接給出操作數(shù) 通常把出現(xiàn)在指令中的操作數(shù)稱為立即數(shù) 為了與直接尋址指令中的直接地址相區(qū)別 在立即數(shù)前面加 標(biāo)志 例如 MOVA 3AH其中3AH就是立即數(shù) 該指令功能是將3AH這個數(shù)本身送入累加器A中 7 3 2 2直接尋址在指令中直接給出操作數(shù)地址 這就是直接尋址方式 例如 MOVA 3AH其中3AH就是表示直接地址 其操作示意圖如圖3 1所示 直接尋址方式可訪問以下存儲空間 內(nèi)部RAM低128個字節(jié)單元 特殊功能寄存器 應(yīng)注意 直接尋址是訪問特殊功能寄存器的唯一方法 8 3 2 3寄存器尋址寄存器尋址即寄存器的內(nèi)容就是操作數(shù) 因此在指令的操作數(shù)位置上指定了寄存器就能得到操作數(shù) MOVA R0MOVR2 A前一條指令是將R0寄存器的內(nèi)容送到累加器A中 后一條是把累加器A中的內(nèi)容傳送到R2寄存器中 采用寄存器尋址方式的指令都是一字節(jié)的指令 可以作寄存器尋址的寄存器有 R0 R7 A AB寄存器對和數(shù)據(jù)指針DPTR 9 3 2 4寄存器間接尋址所謂寄存器間接尋址就是以寄存器中的內(nèi)容作為RAM地址 該地址中的內(nèi)容才是操作數(shù) 寄存器前加 標(biāo)志 表示間接尋址 例如 MOVA R0其操作示意圖如圖3 2所示 此時R0寄存器的內(nèi)容3AH是操作數(shù)地址 內(nèi)部RAM的3AH單元的內(nèi)容65H才是操作數(shù) 把該操作數(shù)傳送到累加器A中 結(jié)果A 65H 10 能用于間接尋址的寄存器有R0 R1 DPTR 其中R0 R1必須是工作寄存器組中的寄存器 間接尋址可以訪問的存儲器空間包括內(nèi)部RAM和外部RAM 內(nèi)部RAM的低128個單元采用R0 R1作為間址寄存器 外部RAM 一是采用R0 R1作為間址寄存器 可尋址256個單元 二是采用16位的DPTR作為間址寄存器 可尋址外部RAM的整個64KB地址空間 11 例如 MOV R0 A 內(nèi)部RAM R0 A a b MOVX DPTR A 外部RAM DPTR A其指令操作過程示意圖如上圖 b 所示 其指令操作過程示意圖如下圖 a 所示 12 對于52子系列的單片機(jī) 其內(nèi)部RAM是256個字節(jié) 其高128字節(jié)地址與特殊功能寄存器的地址是重疊的 在使用上 對52子系列的高128BRAM 必須采用寄存器間接尋址方式訪問 對特殊功能寄存器則必須采用直接尋址方式訪問 3 2 5變址尋址變址尋址是以DPTR或PC作基址寄存器 以累加器A作變址寄存器 并以二者內(nèi)容相加形成的16位地址作為操作數(shù)地址 ROM中地址 例如 MOVCA A DPTR A A DPTR MOVCA A PC A A PC 13 第一條指令的功能將A的內(nèi)容與DPTR的內(nèi)容之和作為操作數(shù)地址 把該地址中的內(nèi)容送入累加器A中 如圖3 3所示 第二條指令的功能將A的內(nèi)容與PC的內(nèi)容之和作為操作數(shù)地址 把該地址中的內(nèi)容送入累加器A中 這兩條指令常用于訪問程序存儲器中的數(shù)據(jù)表格 且都為一字節(jié)指令 14 3 2 6相對尋址相對尋址即將程序計(jì)數(shù)器PC的當(dāng)前值與指令中給出的偏移量rel相加 其結(jié)果作為轉(zhuǎn)移地址送入PC中 相對尋址能修改PC的值 故可用來實(shí)現(xiàn)程序的分支轉(zhuǎn)移 PC當(dāng)前值是指正在執(zhí)行指令的下一條指令的地址 rel是一個帶符號的8位二進(jìn)制數(shù) 取值范圍 128 127 2000H SJMP54H這是無條件相對轉(zhuǎn)移指令 雙字節(jié)指令 指令代碼80H 54H 其中54H是偏移量 15 3 2 7位尋址在指令的操作數(shù)位置上直接給出位地址 這種尋址方式稱為位尋址 MCS 51系列單片機(jī)的特色之一是具有位處理功能 可對尋址的位單獨(dú)進(jìn)行各種操作 例如 MOVC 30H該指令的功能是把位地址30H中的值 0或1 傳送到位累加器CY中 51系列單片機(jī)的內(nèi)部RAM有兩個區(qū)域可以位尋址 一個是位尋址區(qū)20H 2FH單元的128位 另一個是字節(jié)地址能被8整除的特殊功能寄存器的相應(yīng)位 16 在MCS 51系列單片機(jī)中 位地址有以下幾種表示方式 1 直接使用位地址 對于20H 2FH共16個單元的128位 其位地址編號是00H 7FH 例如 20H單元的0 7位的位地址為00H 7H 2 用單元地址加位序號表示 如25H 5表示25H單元的D5位 位地址是2DH 而PSW中的D3可表示為D0H 3 這種表示方法可以避免查表或計(jì)算 比較方便 3 用位名稱表示 特殊功能寄存器中的可尋址位均有位名稱 可以用位名稱來表示該位 如可用RS0表示PSW中的D3位 D0H 3 4 對特殊功能寄存器可直接用寄存器符號加位序號表示 如PSW中的D3位 又可表示為PSW 3 17 例題 1 20H 11HMOVA 20HMOVC 07HA 11HCy 02 20H 11H 24H 7FHMOVA 20HMOVC 20H A 11H Cy 13 30H 1AHMOVA 30H A 30HMOVA 30H A 1AH 18 數(shù)據(jù)傳送類指令的功能是把源操作數(shù)傳送到目的操作數(shù) 源操作數(shù)不變 目的操作數(shù)被源操作數(shù)所代替 3 3 1內(nèi)部RAM數(shù)據(jù)傳送指令內(nèi)部RAM的數(shù)據(jù)傳送類指令是指累加器 寄存器 特殊功能寄存器 RAM單元之間的數(shù)據(jù)相互傳送 1 以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令MOVA data A dataMOVA direct A direct MOVA Rn A Rn MOVA Ri A Ri 這組指令的功能是將源操作數(shù)所指定的內(nèi)容送入累加器A中 3 3數(shù)據(jù)傳送類指令 19 2 以寄存器Rn為目的操作數(shù)的數(shù)據(jù)傳送指令MOVRn A Rn A MOVRn data Rn dataMOVRn direct Rn direct 這組指令的功能是將源操作數(shù)所指定的內(nèi)容送到當(dāng)前工作寄存器組R0 R7中的某個寄存器中 注意 沒有 MOVRn Rn 指令 也沒有 MOVRn Ri 指令 例3 1 A 50H R1 10H R2 20H R3 30H 30H 4FH 執(zhí)行下述指令 MOVR1 A R1 A MOVR2 30H R2 30H MOVR3 85H R3 85H執(zhí)行后 R1 50H R2 4FH R3 85H 20 3 以直接地址為目的操作數(shù)的數(shù)據(jù)傳送指令MOVdirect A direct A MOVdirect data direct dataMOVdirect1 direct2 direct1 direct2 MOVdirect Rn direct Rn MOVdirect Ri direct Ri 這組指令的功能是將源操作數(shù)所指定的內(nèi)容送入由直接地址direct所指定的片內(nèi)存儲單元 例3 2已知 R0 60H 60H 72H MOV40H R0 40H 60H 指令執(zhí)行過程如圖3 5所示 執(zhí)行結(jié)果為 40H 72H 21 4 以間接地址 Ri為目的操作數(shù)的數(shù)據(jù)傳送指令MOV Ri A Ri A MOV Ri data Ri dataMOV Ri direct Ri direct 這組指令的功能是把源操作數(shù)所指定的內(nèi)容送入以R0或R1為地址指針的片內(nèi)RAM單元中 源操作數(shù)可采用寄存器尋址 立即尋址和直接尋址3種方式 注意 沒有 MOV Ri Rn 指令 例3 3已知 R1 30H A 20H 執(zhí)行指令 MOV R1 A 30H A 執(zhí)行結(jié)果為 30H 20H 22 5 以DPTR為目的操作數(shù)的數(shù)據(jù)傳送指令MOVDPTR data16 DPTR data16這是MCS 51系列單片機(jī)指令系統(tǒng)中唯一的一條16位立即數(shù)傳送指令 其功能是將外部存儲器 RAM或ROM 某單元地址作為立即數(shù)送到DPTR中 立即數(shù)的高8位送DPH 低8位送DPL 在學(xué)習(xí) 使用上述各條指令時 需注意以下幾點(diǎn) 1 要區(qū)分各種尋址方式的含義 正確傳送數(shù)據(jù) 2 所有傳送指令都不影響標(biāo)志位 這里所說的標(biāo)志位是指CY AC 和OV 涉及到累加器A的將影響奇偶標(biāo)志位P 23 3 估算指令的字節(jié)數(shù) 凡是指令中既不包含直接地址 又不包含8位立即數(shù)的指令均為一字節(jié)指令 若指令中包含一個直接地址或8位立即數(shù) 則指令字節(jié)數(shù)為2 若包含兩個這樣的操作數(shù) 則指令字節(jié)數(shù)為3 例3 4若 R0 30H 30H 50H 執(zhí)行指令 MOVA R0 A 30H 一字節(jié) MOVA 30H A 50H 二字節(jié) MOVA 30H A 30H 二字節(jié) MOV30H 0FH 30H 0FH 三字節(jié) MOVDPTR 2000H DPH 20H DPL 00H 三字節(jié) 24 例 30H 40H 40H 10H 10H 32H P1 EFHMOVR0 30HMOVA R0MOVR1 AMOVB R1MOV R1 P1MOVP2 P1MOV10H 20HMOV30H 10H 25 3 3 2訪問外部RAM的數(shù)據(jù)傳送指令CPU與外部RAM或I O口進(jìn)行數(shù)據(jù)傳送 必須采用寄存器間接尋址的方式 并通過累加器A來傳送 這類指令共有四條 MOVXA DPTR A DPTR MOVX DPTR A DPTR AMOVXA Ri A Ri MOVX Ri A Ri A前兩條指令是以DPTR作為間址寄存器 DPTR是16位地址指針 因此其尋址范圍可達(dá)片外RAM64KB空間 后兩條指令是以R0或R1作為間址寄存器 R0或R1是8位地址指針 因此其尋址范圍僅限于外部RAM256個字節(jié)單元 該組指令的功能 在DPTR或R0 R1所指定的外部RAM單元與累加器A之間傳送數(shù)據(jù) 26 例3 5試編程 將片外RAM的2000H單元內(nèi)容送入片外RAM的0200H單元中 解 片外RAM與片外RAM之間不能直接傳送數(shù)據(jù) 需通過累加器A傳送 另外 當(dāng)片外RAM地址值大于FFH時 需用DPTR作為間址寄存器 編程如下 MOVDPTR 2000H 源數(shù)據(jù)地址送DPTRMOVXA DPTR 從外部RAM中取數(shù)送AMOVDPTR 0200H 目的地址送DPTRMOVX DPTR A A中內(nèi)容送外部RAM 27 3 3 3程序存儲器向累加器A傳送數(shù)據(jù)指令MOVCA A DPTR A A DPTR MOVCA A PC A A PC 兩條指令適合于查閱在ROM中建立的數(shù)據(jù)表格 也稱作查表指令 實(shí)現(xiàn)的功能完全相同 但使用中有一點(diǎn)差異 第一條指令采用DPTR作為基址寄存器 使用前可將16位地址送入DPTR中 實(shí)現(xiàn)在64KBROM空間向累加器A的數(shù)據(jù)傳送 數(shù)據(jù)表格可存放在64KBROM的任意位置 因此這條指令稱為遠(yuǎn)程查表指令 第二條指令是以PC作為基址寄存器 程序中PC值是確定的 為下一條指令的地址 不是表格首地址 使基址與實(shí)際要讀取的數(shù)據(jù)表格首地址不一致 這樣A PC與實(shí)際要訪問的單元地址就不一致 因此 使用該指令之前要用一條加法指令進(jìn)行地址調(diào)整 28 由于PC的內(nèi)容不能隨意改變 所以只能借助于A來進(jìn)行調(diào)整 即通過對累加器A加一個數(shù) 使得A PC和所讀ROM單元地址一樣 例3 6若在外部ROM中2000H單元存放 0 9 的平方值0 1 4 9 81 要求根據(jù)累加器A中的值 0 9 來查找所對應(yīng)的平方值 并存入60H單元中 解 用DPTR作基址寄存器 MOVDPTR 2000H 表格首地址送DPTRMOVCA A DPTR 根據(jù)表格首地址及A中值確定地址 取數(shù)送A MOV60H A 存結(jié)果此處 A DPTR 之和為所查平方值所存地址 29 用PC作為基址寄存器 在MOVC指令之前先用一條加法指令進(jìn)行地址調(diào)整 ADDA data A data作地址調(diào)整MOVCA A PC A data PC 確定查表地址 取數(shù)送A MOV60H A 存結(jié)果RET2000H DB0 1 4 9 16 25 36 81執(zhí)行MOVC指令時 PC已指向下一條指令地址 很顯然 PC的內(nèi)容不是要查找的表格首地址2000H 二者之間存在地址差 這個地址差就是MOVC下邊的指令與數(shù)據(jù)表格首地址之間 其他指令所占的字節(jié)數(shù)之和 在本例中 地址差是03 即data 03H 30 3 3 4數(shù)據(jù)交換指令數(shù)據(jù)交換指令共有五條 可完成累加器和內(nèi)部RAM單元之間的整字節(jié)或半字節(jié)交換 1 整字節(jié)交換指令整字節(jié)交換指令有三條 完成累加器A與內(nèi)部RAM單元內(nèi)容的整字節(jié)交換 XCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 2 半字節(jié)交換指令XCHDA Ri A 3 0 Ri 3 0低半字節(jié)交換 高半字節(jié)不變 3 累加器高低半字節(jié)交換指令SWAPA A 7 4 A 3 0 31 例3 7試編程 將外部RAM1000H單元中的數(shù)據(jù)與內(nèi)部RAM6AH單元中的數(shù)據(jù)相互交換 解 數(shù)據(jù)交換指令只能完成累加器A和內(nèi)部RAM單元之間的數(shù)據(jù)交換 要完成外部RAM與內(nèi)部RAM之間的數(shù)據(jù)交換 需先把外部RAM中的數(shù)據(jù)取到A中 交換后再送回到外部RAM中 編程如下 MOVDPTR 1000H 外部RAM地址送DPTRMOVXA DPTR 從外部RAM中取數(shù)送AXCHA 6AH A與6AH地址中的內(nèi)容交換MOVX DPTR A 交換結(jié)果送外部RAM 32 3 3 5堆棧操作指令所謂堆棧是在片內(nèi)RAM中按 先進(jìn)后出 后進(jìn)先出 原則設(shè)置的專用存儲區(qū) 數(shù)據(jù)的進(jìn)棧出棧由指針SP統(tǒng)一管理 可實(shí)現(xiàn)對數(shù)據(jù)或斷點(diǎn)地址的保護(hù) 堆棧的操作有如下兩條專用指令 PUSHdirect SP SP 1 SP direct POPdirect direct SP SP SP 1前一條指令是進(jìn)棧指令 其功能是先將棧指針SP的內(nèi)容加1 使它指向棧頂空單元 然后將直接地址direct單元的內(nèi)容送入棧頂空單元 后一條指令是出棧指令 其功能是將SP所指的單元內(nèi)容送入直接地址所指出的單元中 然后將棧指針SP的內(nèi)容減1 使之指向新的棧頂單元 注意 進(jìn)棧 出棧指令只能以直接尋址方式來取得操作數(shù) 不能用累加器或工作寄存器Rn作為操作數(shù) 33 例 設(shè) 30H x 40H y 試?yán)枚褩V噶罹幊?0H和40H單元中內(nèi)容相交換的程序 MOVSP 70HPUSH30HPUSH40HPOP30HPOP40HPUSHACCPUSHA 34 算術(shù)運(yùn)算類指令可以完成加 減 乘 除等各種操作 全部指令都是8位數(shù)運(yùn)算指令 如果需要作16位數(shù)的運(yùn)算則需編寫相應(yīng)的程序來實(shí)現(xiàn) 算術(shù)運(yùn)算類指令大多數(shù)要影響到程序狀態(tài)字寄存器PSW中的溢出標(biāo)志OV 進(jìn)位 借位 標(biāo)志CY 輔助進(jìn)位標(biāo)志AC和奇偶標(biāo)志位P 3 4 1加法指令A(yù)DDA data A A dataADDA direct A A direct ADDA Rn A A Rn ADDA Ri A A Ri 3 4算術(shù)運(yùn)算類指令 35 這組指令的功能是把源操作數(shù)所指出的內(nèi)容與累加器A的內(nèi)容相加 其結(jié)果存放在A中 該組指令對PSW中各標(biāo)志位的影響情況如下 進(jìn)位標(biāo)志CY 如D7位向上有進(jìn)位 則CY 1 否則CY 0 半進(jìn)位標(biāo)志AC 如D3位向上有進(jìn)位 AC 1 否則AC 0 溢出標(biāo)志OV 若D7 D6位只有一個向上有進(jìn)位 OV 1 若D7 D6同時有進(jìn)位或同時無進(jìn)位時 OV 0 奇偶標(biāo)志P 當(dāng)A中 1 的個數(shù)為奇數(shù)時 P 1 為偶數(shù)時 P 0 36 例3 8設(shè)A 94H 30H 8DH 執(zhí)行指令A(yù)DDA 30H 操作如下 10010100 10001101100100001結(jié)果 A 21H CY 1 AC 1 OV 1 P 0參加運(yùn)算的兩個數(shù) 可以是無符號數(shù) 0 255 也可以是有符號數(shù) 128 127 上例中 若把94H 8DH看作無符號數(shù)相加 結(jié)果中CY 1 表示運(yùn)算結(jié)果發(fā)生了溢出 結(jié)果超出了8位 此時溢出的含義是向高位產(chǎn)生進(jìn)位 所以確定結(jié)果時不能只看累加器A的內(nèi)容 而應(yīng)該把CY的值加到高位上 才可得到正確的結(jié)果 即結(jié)果為121H 若把94H 8DH看作有符號數(shù) 補(bǔ)碼表示的 結(jié)果中OV 1 它表示運(yùn)算結(jié)果發(fā)生了溢出 A中的值是個錯誤的結(jié)果 37 3 4 2帶進(jìn)位加法指令A(yù)DDCA data A A data CY ADDCA direct A A direct CY ADDCA Rn A A Rn CY ADDCA Ri A A Ri CY 這組指令的功能是把源操作數(shù)所指出的內(nèi)容與累加器A的內(nèi)容相加 再加上進(jìn)位標(biāo)志CY的值 其結(jié)果存放在A中 運(yùn)算結(jié)果對PSW標(biāo)志位的影響與ADD指令相同 需要說明的是 這里所加的進(jìn)位標(biāo)志CY的值是在該指令執(zhí)行之前已經(jīng)存在的進(jìn)位標(biāo)志值 而不是執(zhí)行該指令過程中產(chǎn)生的進(jìn)位標(biāo)志值 38 例3 9設(shè) A AEH R1 81H CY 1 執(zhí)行指令A(yù)DDCA R1 則操作如下 1010111010000001 1 CY 100110000結(jié)果 A 30H CY 1 OV 1 AC 1 P 0帶進(jìn)位加法指令主要用于多字節(jié)數(shù)的加法運(yùn)算 因低位字節(jié)相加時可能產(chǎn)生進(jìn)位 而在進(jìn)行高位字節(jié)相加時 要考慮低位字節(jié)向高位字節(jié)的進(jìn)位 因此 在進(jìn)行高位字節(jié)相加時必須使用帶進(jìn)位的加法指令 39 例3 10設(shè)有兩個無符號16位二進(jìn)制數(shù) 分別存放在30H 31H單元和40H 41H單元中 低8位先存 寫出兩個16位數(shù)的加法程序 將和存入50H 51H單元 設(shè)和不超過16位 解 由于不存在16位數(shù)的加法指令 所以只能先加低8位 后加高8位 而在加高8位時要連低8位相加的進(jìn)位一起相加 編程如下 MOVA 30H 取一個加數(shù)的低字節(jié)送A中ADDA 40H 兩個低字節(jié)數(shù)相加MOV50H A 結(jié)果送50H單元MOVA 31H 取一個加數(shù)的高字節(jié)送A中ADDCA 41H 高字節(jié)數(shù)相加 同時加低字節(jié)產(chǎn)生的進(jìn)位MOV51H A 結(jié)果送51H單元 40 3 4 3帶借位減法指令SUBBA data A A data CY SUBBA direct A A direct CY SUBBA Rn A A Rn CY SUBBA Ri A A Ri CY 減法指令對PSW中各標(biāo)志位的影響情況如下 借位標(biāo)志CY 如D7位向上需借位 則CY 1 否則CY 0 半借位標(biāo)志AC 如D3位向上需借位 AC 1 否則AC 0 溢出標(biāo)志OV 若D7 D6位只有一個向上有借位 OV 1 若若D7 D6位同時有借位或同時無借位時 OV 0 奇偶標(biāo)志P 當(dāng)A中 1 的個數(shù)為奇數(shù)時 P 1 為偶數(shù)時 P 0 注 減法運(yùn)算只有帶借位減法指令 而沒有不帶借位的減法指令 若要進(jìn)行低字節(jié)的減法運(yùn)算 應(yīng)該先用指令將CY清0 然后再執(zhí)行SUBB指令 41 例3 11設(shè) A DBH R4 73H CY 1 執(zhí)行指令SUBBA R4則操作如下 11011011 DBH 1101101101110011 73H 10001101 73H補(bǔ)碼 1 CY 11111111 1補(bǔ)碼 011001111001100111 a 常規(guī)減法 b 減法變補(bǔ)碼相加結(jié)果 A 67H C 0 AC 0 OV 1 P 1 由上述二式可見兩種算法的最終結(jié)果是一樣的 在此例中 若DBH和73H是兩個無符號數(shù) 則結(jié)果67H是正確的 反之 若為兩個帶符號數(shù) 則由于產(chǎn)生OV 1 使得結(jié)果是錯誤的 因?yàn)樨?fù)數(shù)減正數(shù)其結(jié)果不可能是正數(shù) OV 1 就指出了這一錯誤 42 3 4 4加1指令I(lǐng)NCA A A 1INCdirect direct direct 1INCRn Rn Rn 1INC Ri Ri Ri 1INCDPTR DPTR DPTR 1這組指令的功能是將操作數(shù)所指定單元的內(nèi)容加1 3 4 5減1指令DECA A A 1DECdirect direct direct 1DECRn Rn Rn 1DEC Ri Ri Ri 1這組指令的功能是將操作數(shù)所指定單元的內(nèi)容減1 加1 減1指令均不影響PSW中的OV CY AC標(biāo)志 43 例 已知A 8FH R0 55H 56H 0BBH DPTR 2001H 執(zhí)行如下程序后A R0 56H和DPTR中的內(nèi)容是什么 INCAINCR0INC56HINC R0INCDPTRA 90H R0 56H 56H 0BDH DPTR 2002H 44 例 已知 A 0DFH R1 40H R7 19H 30H 00H和 40H 0FFH 問 A和PSW各標(biāo)志位狀態(tài)如何 DECA A 0DEH P 0DECR7 R7 18H PSW不變DEC30H 30H 0FFH PSW不變DEC R1 40H 0FEH PSW不變 45 3 4 6乘 除法指令1 乘法指令MULAB BA A B 指令功能 把累加器A和寄存器B中的兩個8位無符號數(shù)相乘 所得16位乘積的低8位放在A中 高8位放在B中 乘法指令執(zhí)行后會影響三個標(biāo)志 若乘積小于FFH 即B的內(nèi)容為0 則OV 0 否則OV 1 CY 0 奇偶標(biāo)志P仍按A中1的奇偶性來確定 例3 12已知 A 80H B 32H 執(zhí)行指令MULAB結(jié)果 A 00H B 19H OV 1 CY O P 0 46 2 除法指令DIVAB A A B 之商 B A B 之余數(shù)功能 對兩個8位無符號數(shù)進(jìn)行除法運(yùn)算 其中被除數(shù)存放在累加器A中 除數(shù)存放在寄存器B中 執(zhí)行后 商存于累加器A中 余數(shù)存于寄存器B中 除法指令執(zhí)行后也影響三個標(biāo)志 若除數(shù)為0 即B 0 時 OV 1 表示除法沒有意義 若除數(shù)不為0 則OV 0 表示除法正常進(jìn)行 CY 0 奇偶標(biāo)志P仍按A中1的奇偶性來確定 例3 13已知 A 87H 135D B 0CH 12D 執(zhí)行指令DIVAB結(jié)果 A 0BH B 03H OV 0 CY 0 P 1 47 3 4 7十進(jìn)制調(diào)整指令格式 DAA功能 對A中剛進(jìn)行的兩個BCD碼的加法結(jié)果自動進(jìn)行修正 該指令只影響進(jìn)位標(biāo)志CY 所謂BCD碼就是采用四位二進(jìn)制編碼表示的十進(jìn)制數(shù) 四位二進(jìn)制數(shù)共有十六個編碼 BCD碼是取它前十個的編碼0000 1001來代表十進(jìn)制數(shù)的0 9 這種編碼簡稱為BCD碼 如果兩個BCD碼數(shù)相加 結(jié)果也是BCD碼 則該加法運(yùn)算稱為BCD碼加法 在單片機(jī)中沒有專門的BCD碼加法指令 要進(jìn)行BCD碼加法運(yùn)算 也要使用加法指令A(yù)DD或ADDC 然而計(jì)算機(jī)在執(zhí)行ADD或ADDC指令時 是按照二進(jìn)制規(guī)則進(jìn)行的 對于4位二進(jìn)制數(shù)是按逢16進(jìn)位 而BCD碼是逢十進(jìn)位的 二者存在進(jìn)位差 因此用ADD或ADDC指令進(jìn)行BCD碼相加時 可能會出現(xiàn)錯誤 使用DAA能對運(yùn)算結(jié)果自動進(jìn)行修正 使用方法 在上述加法指令后面緊跟一條DAA指令 48 例3 14試編寫程序 實(shí)現(xiàn)95 59的BCD碼加法 并將結(jié)果存入30H 31H單元 MOVA 95H 95的BCD碼數(shù)送A中ADDA 59H 兩個BCD碼相加 結(jié)果在A中DAA 對相加結(jié)果進(jìn)行十進(jìn)制調(diào)整MOV30H A 十位個位的BCD碼之和送30HMOVA 00H A清0ADDCA 00H 加進(jìn)位 百位的BCD碼 DAA BCD碼相加后 用調(diào)整指令MOV31H A 存進(jìn)位第一次執(zhí)行DAA指令的結(jié)果 A 54H CY 1 最終結(jié)果 31H 01H 30H 54H 49 若要進(jìn)行BCD碼減法運(yùn)算 也應(yīng)該進(jìn)行調(diào)整 但不存在十進(jìn)制減法調(diào)整指令 因此可將減法改為加法 加減數(shù)的補(bǔ)數(shù) 兩位十進(jìn)制數(shù)是對100取補(bǔ)的 例如減法60 30 30 也可以改為補(bǔ)數(shù)相加 60 100 30 130去掉進(jìn)位 就能得到正確的結(jié)果 例3 15編寫程序?qū)崿F(xiàn)十進(jìn)制減法 計(jì)算87 38 CLRC 減法之前 先清CY位MOVA 9AH 9AH 即100 送A中SUBBA 38H 做減法 38的補(bǔ)數(shù)送A中ADDA 87H 38的補(bǔ)數(shù)與87做加法 DAA 對相加結(jié)果進(jìn)行調(diào)整 50 分析 減數(shù)求補(bǔ)數(shù)與被減數(shù)相加1001101001100010 00111000 100001110110001011101001 十進(jìn)制調(diào)整11101001 01100000101001001去掉進(jìn)位 取調(diào)整結(jié)果的低8位 即得結(jié)果為十進(jìn)制數(shù)49 顯然是正確的結(jié)果 51 邏輯運(yùn)算的特點(diǎn) 按位進(jìn)行操作 邏輯運(yùn)算包括與 或 異或三種 此外還有移位指令以及對累加器A清零和求反指令 3 5 1邏輯與運(yùn)算指令A(yù)NLA data A A dataANLA direct A A direct ANLA Rn A A Rn ANLA Ri A A Ri ANLdirect A direct direct A ANLdirect data direct direct data指令應(yīng)用 用于將某些位屏蔽 即使之為0 方法是 將要屏蔽的位和 0 相與 保留不變的位同 1 相與 3 5邏輯運(yùn)算及移位類指令 52 3 5 2邏輯或運(yùn)算指令ORLA data A A dataORLA direct A A direct ORLA Rn A A Rn ORLA Ri A A Ri ORLdirect A direct direct A ORLdirect data direct direct data指令應(yīng)用 用于將某些位置位 即使之為1 方法是 將要置位的位和 1 相或 要保留不變的位同 0 相或 53 3 5 3邏輯異或運(yùn)算指令XRLA data A A dataXRLA direct A A direct XRLA Rn A A Rn XRLA Ri A A Ri XRLdirect A direct direct A XRLdirect data direct direct data指令應(yīng)用 用于將某些位取反 方法是 將需求反的位同 1 相異或 要保留的位同 0 相異或 54 例3 16將累加器A的低4位送到P1口的低4位輸出 而P1的高4位保持不變 解 這種操作不能簡單地用MOV指令實(shí)現(xiàn) 而可以借助與 或邏輯運(yùn)算 編程如下 ANLA 0FH 屏蔽A的高4位 保留低4位ANLP1 0F0H 屏蔽P1的低4位 保留高4位ORLP1 A 通過或運(yùn)算 完成所需操作例3 17試編程 使內(nèi)部RAM30H單元中的低2位清0 高2位置1 其余4位取反 解 ANL30H 0FCH 30H單元中低2位清0ORL30H 0C0H 30H單元中高2位置1XRL30H 3CH 30H單元中間4位變反 55 3 5 4 累加器清零 取反指令累加器清零指令 CLRA A 0累加器按位取反指令 CPLA A 清零和取反指令只有累加器A才有 它們都是一字節(jié)指令 如果用其他方式來達(dá)到清零或取反的目的 則都為二字節(jié)的指令 MCS 51系列單片機(jī)只有對A的取反指令 沒有求補(bǔ)指令 若要進(jìn)行求補(bǔ)操作 可按 求反加1 來進(jìn)行 以上所有的邏輯運(yùn)算指令 對CY AC和OV標(biāo)志都沒有影響 只在涉及到累加器A時 才會影響奇偶標(biāo)志P 56 例 已知 30H單元中有一數(shù)x 試寫出對它求補(bǔ)的程序 MOVA 30HCPLAINCAMOV30H A 57 例 在下圖中 若x y和z的三個輸入信號放在X Y和Z單元 試編出可以模擬該電路功能的程序 并把電路的輸出信號送入F單元 MOVA XANLA YMOVR1 AMOVA YXRLA ZCPLAORLA R1MOVF A 58 3 5 5循環(huán)移位指令移位指令只能對累加器A進(jìn)行移位 共有循環(huán)左移 循環(huán)右移 帶進(jìn)位的循環(huán)左移和右移四種 循環(huán)左移RLA Ai 1 Ai A0 A7循環(huán)右移RRA Ai Ai 1 A7 A0帶進(jìn)位循環(huán)左移RLCA A0 CY Ai 1 Ai CY A7帶進(jìn)位循環(huán)右移RRCA A7 CY Ai Ai 1 CY A0前兩條指令的功能分別是將累加器A的內(nèi)容循環(huán)左移或右移一位 執(zhí)行后僅影響PSW中的P標(biāo)志 后兩條指令的功能分別是將累加器A的內(nèi)容帶進(jìn)位位CY一起循環(huán)左移或右移一位 執(zhí)行后影響PSW中的進(jìn)位位CY和奇偶標(biāo)志位P 59 以上移位指令 可用圖形表示 如圖3 6所示 60 舉例 例3 18 設(shè) A 08H 分析下面程序執(zhí)行結(jié)果 1 RLA A的內(nèi)容左移一位 結(jié)果 A 10HRLA A的內(nèi)容左移一位 結(jié)果 A 20HRLA A的內(nèi)容左移一位 結(jié)果 A 40H即左移一位 相當(dāng)于原數(shù)乘2 原數(shù)小于80H時 2 RRA A的內(nèi)容右移一位 結(jié)果 A 04HRRA A的內(nèi)容右移一位 結(jié)果 A 02HRRA A的內(nèi)容右移一位 結(jié)果 A 01H即右移一位 相當(dāng)于原數(shù)除2 原數(shù)為偶數(shù)時 61 例 已知M1和M1 1單元中有一個16位的二進(jìn)制數(shù) M1 低8位 請編程令其擴(kuò)大到二倍 CLRCMOVR1 M1RLCAMOV R1 AINCR1MOVA R1RLCAMOV R1 A 62 3 6控制轉(zhuǎn)移類指令 51系列單片機(jī)有比較豐富的控制轉(zhuǎn)移指令 包括無條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令和子程序調(diào)用及返回指令 這類指令的特點(diǎn) 自動改變PC的內(nèi)容 使程序發(fā)生轉(zhuǎn)移 3 6 1無條件轉(zhuǎn)移指令有四條無條件轉(zhuǎn)移指令 提供了不同的轉(zhuǎn)移范圍 可使程序無條件地轉(zhuǎn)到指令所提供的地址上去 1 長轉(zhuǎn)移指令LJMPaddr16 PC addr16功能 把指令中給出的16位目的地址addr16送入程序計(jì)數(shù)器PC 使程序無條件轉(zhuǎn)移到addr16處執(zhí)行 16位地址可尋址64KBROM 故稱為長轉(zhuǎn)移指令 長轉(zhuǎn)移指令是三字節(jié)指令 依次是操作碼 高8位地址 低8位地址 63 2 絕對轉(zhuǎn)移指令A(yù)JMPaddr11 PC PC 2 PC10 0 addr11這是一條二字節(jié)指令 其指令格式為 a10a9a800001a7a6a5a4a3a2a1a0指令中提供了11位目的地址 其中a7 a0在第二字節(jié) a10 a8則占據(jù)第一字節(jié)的高3位 而00001是這條指令特有的操作碼 占據(jù)第一字節(jié)的低5位 絕對轉(zhuǎn)移指令的執(zhí)行分為兩步 第一步 取指令 此時PC自身加2指向下一條指令的起始地址 稱為PC當(dāng)前值 第二步 用指令中給出的11位地址替換PC當(dāng)前值的低11位 PC高5位保持不變 形成新的PC值 即轉(zhuǎn)移的目的地址 64 11位地址的范圍為00000000000 11111111111 即可轉(zhuǎn)移的范圍是2KB 轉(zhuǎn)移可以向前也可以向后 如圖3 7所示 但要注意轉(zhuǎn)移到的位置是與PC 2的地址在同一個2K區(qū)域 65 例3 19分析下面絕對轉(zhuǎn)移指令的執(zhí)行情況 1234H AJMP0781H分析 在指令執(zhí)行前 PC 1234H 取出該指令后 PC 2形成PC當(dāng)前值 它等于1236H 即0001001000110110B 指令執(zhí)行過程 用指令給出的11位地址11110000001B替換PC當(dāng)前值的低11位 即新的PC值為1781H 所以指令執(zhí)行結(jié)果就是轉(zhuǎn)移到1781H處執(zhí)行程序 應(yīng)注意 只有轉(zhuǎn)移的目的地址與PC當(dāng)前值在2K范圍之內(nèi)時 才可使用AJMP指令 超出2K范圍 應(yīng)使用長轉(zhuǎn)移指令LJMP 66 3 短轉(zhuǎn)移指令SJMPrel PC PC 2 PC PC relSJMP是無條件相對轉(zhuǎn)移指令 該指令為雙字節(jié) rel是相對轉(zhuǎn)移偏移量 指令的執(zhí)行分兩步完成 第一步 取指令 此時PC自身加2形成PC的當(dāng)前值 第二步 將PC當(dāng)前值與偏移量rel相加形成轉(zhuǎn)移的目的地址送PC中 即 目的地址 PC 2 relrel其范圍為 128 127 這條指令的優(yōu)點(diǎn)是 指令給出的是相對轉(zhuǎn)移地址 不具體指出地址值 當(dāng)程序地址發(fā)生變化時 只要相對地址不發(fā)生變化 該指令就不需要作任何改動 67 4 變址尋址轉(zhuǎn)移指令 稱散轉(zhuǎn)指令 間接轉(zhuǎn)移指令 JMP A DPTR PC A DPTR 指令的功能 把累加器A中的8位無符號數(shù)與基址寄存器DPTR中的16位地址相加 所得的和作為目的地址送入PC 該指令特點(diǎn) 轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變 例如 在DPTR中裝入多分支轉(zhuǎn)移指令表的首地址 而由累加器A中的內(nèi)容來動態(tài)選擇應(yīng)轉(zhuǎn)向哪一條分支 實(shí)現(xiàn)由一條指令完成多分支轉(zhuǎn)移的功能 例3 20設(shè)累加器A中存有用戶從鍵盤輸入的鍵值0 3 鍵處理程序分別存放在KPRG0 KPRG1 KPRG2 KPRG3位置處 試編寫程序 根據(jù)用戶輸入的鍵值 轉(zhuǎn)入相應(yīng)的鍵處理程序 68 MOVDPTR JPTAB 轉(zhuǎn)移指令表首地址送DPTRRLA 鍵值 2 AJMP指令占2個字節(jié)JMP A DPTR JPTAB 2 鍵值 和送PC中 則程序轉(zhuǎn)移到表中某一位置去執(zhí)行AJMP指令JPTAB AJMPKPRG0AJMPKPRG1AJMPKPRG2AJMPKPRG3KPRG0 KPRG1 KPRG2 KPRG3 69 3 6 2條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是指當(dāng)某種條件滿足時 轉(zhuǎn)移才進(jìn)行 而條件不滿足時 程序就按順序往下執(zhí)行 條件轉(zhuǎn)移指令的共同特點(diǎn)是 1 所有的條件轉(zhuǎn)移指令都屬于相對轉(zhuǎn)移指令 轉(zhuǎn)移范圍相同 都在以PC當(dāng)前值為基準(zhǔn)的256B范圍內(nèi) 128 127 2 計(jì)算轉(zhuǎn)移地址的方法相同 轉(zhuǎn)移地址 PC當(dāng)前值 rel1 累加器判零轉(zhuǎn)移指令JZrel 若 A 0 則轉(zhuǎn)移 PC PC 2 rel 若 A 0 按順序執(zhí)行 PC PC 2JNZrel 若 A 0 則轉(zhuǎn)移 PC PC 2 rel 若 A 0 按順序執(zhí)行 PC PC 2 70 例 已知 外部RAM中DATA1為始地址的數(shù)據(jù)塊以零為結(jié)束標(biāo)志 試編程將之傳送到以DATA2為始地址的內(nèi)部RAM區(qū) MOVR0 DATA1MOVR1 DATA2LOOP MOVXA R0JZDONEMOV R1 AINCR0INCR1SJMPLOOPDONE SJMP 71 2 比較條件轉(zhuǎn)移指令CJNEA data rel 若 A data 則PC PC 3 CY 0若 A data 則PC PC 3 rel CY 0若 A direct 則PC PC 3 rel CY 0若 A data 則PC PC 3 rel CY 0若 Rn data 則PC PC 3 rel CY 1 72 CJNE Ri data rel 若 Ri data 則PC PC 3 CY 0若 Ri data 則PC PC 3 rel CY 0若 Ri data 則PC PC 3 rel CY 1在使用CJNE指令時應(yīng)注意以下幾點(diǎn) 1 比較條件轉(zhuǎn)移指令都是三字節(jié)指令 PC當(dāng)前值 PC 3 PC是該指令所在地址 轉(zhuǎn)移的目的地址 PC 3 rel 2 比較操作實(shí)際就是作減法操作 只是不保存減法所得到的差而將結(jié)果反映在標(biāo)志位CY上 3 CJNE指令將參與比較的兩個操作數(shù)當(dāng)作無符號數(shù)看待 處理并影響CY標(biāo)志 因此CJNE指令不能直接用于有符號數(shù)大小的比較 若進(jìn)行兩個有符號數(shù)大小的比較 則應(yīng)依據(jù)符號位和CY位進(jìn)行判別比較 73 3 減1條件轉(zhuǎn)移指令DJNZRn rel Rn Rn 1若 Rn 0 則轉(zhuǎn)移 PC PC 2 rel若 Rn 0 按順序執(zhí)行 PC PC 2DJNZdirect rel direct direct 1若 direct 0 則轉(zhuǎn)移 PC PC 3 rel若 direct 0 按順序執(zhí)行 PC PC 3第一條為二字節(jié)指令 第二條為三字節(jié)指令 這兩條指令對于構(gòu)成循環(huán)程序十分有用 使用中可以指定任何一個工作寄存器或者內(nèi)部RAM單元為計(jì)數(shù)器 對計(jì)數(shù)器賦以初值以后 就可以利用上述指令對計(jì)數(shù)器進(jìn)行減1 不為零就進(jìn)入循環(huán)操作 為零就結(jié)束循環(huán) 從而構(gòu)成循環(huán)程序 74 例3 21試編寫程序 將內(nèi)部RAM以DATA為起始地址的10個單元中的數(shù)據(jù)求和 并將結(jié)果送入SUM單元 設(shè)和不大于255 解 對一組連續(xù)存放的數(shù)據(jù)進(jìn)行操作時 一般都采用間接尋址 使用INC指令修改地址 可使編程簡單 利用減1條件轉(zhuǎn)移指令很容易編成循環(huán)程序來完成10個數(shù)相加 MOVR0 DATA 首地址送間址寄存器R0MOVR7 0AH 計(jì)數(shù)器R7送入計(jì)數(shù)初值CLRA 累加器A作累加和 先清0LP ADDA R0 加一個數(shù)INCR0 地址加1 指向下一地址單元DJNZR7 LP 計(jì)數(shù)值減1不為零循環(huán)MOVSUM A 累加和存入指定單元SJMP 結(jié)束 75 例3 22將外部RAM的一個數(shù)據(jù)塊傳送到內(nèi)部RAM 兩者的首地址分別為DATA1和DATA2 遇到傳送的數(shù)據(jù)為 字符 停止傳送 MOVDPTR DATA1 外部數(shù)據(jù)塊首地址送DPTRMOVR1 DATA2 內(nèi)部數(shù)據(jù)塊首地址送R1LP MOVXA DPTR 從外部RAM取數(shù)送入ACJNEA 24H LP1 與 的ASC 碼比較 不相等轉(zhuǎn)LP1 SJMPLP2 相等 轉(zhuǎn)LP2LP1 MOV R1 A 不是 字符 執(zhí)行傳送INCDPTR 修改源地址指針I(yè)NCR1 修改目的地址指針SJMPLP 轉(zhuǎn)傳送下一個數(shù)據(jù)LP2 SJMP 結(jié)束 76 以上條件轉(zhuǎn)移指令都是相對轉(zhuǎn)移指令 轉(zhuǎn)移的范圍有限 若要在大范圍內(nèi)實(shí)現(xiàn)條件轉(zhuǎn)移 可將條件轉(zhuǎn)移指令和長轉(zhuǎn)移指令LJMP結(jié)合起來加以實(shí)現(xiàn) 例如 根據(jù)A和立即數(shù)80H比較的結(jié)果轉(zhuǎn)移到標(biāo)號NEXT1 其轉(zhuǎn)移的距離已超過了256字節(jié) 則可用下述指令來實(shí)現(xiàn) CJNEA 80H NEXT 不相等 則轉(zhuǎn)移 相等 按順序執(zhí)行SJMPNEXT2 處理完 跳到NEXT2NEXT LJMPNEXT1 長轉(zhuǎn)移至NEXT1CJNE與LJMP兩條指令的結(jié)合 可以實(shí)現(xiàn)在64KB范圍內(nèi)的條件轉(zhuǎn)移 其中的SJMPNEXT2指令是在執(zhí)行完兩數(shù)相等的處理后 轉(zhuǎn)移到繼續(xù)執(zhí)行的位置 以免也要去執(zhí)行LJMP指令 造成程序邏輯上的混亂 77 3 6 3子程序調(diào)用及返回指令調(diào)用子程序的程序稱之為主程序 主程序和子程序之間的調(diào)用關(guān)系可用圖3 8表示 從圖中可看出 子程序調(diào)用要中斷原有指令的執(zhí)行順序 轉(zhuǎn)移到子程序的入口地址去執(zhí)行 與轉(zhuǎn)移指令不同的是 子程序執(zhí)行完畢后 要返回到原來被中斷的位置 繼續(xù)往下執(zhí)行 子程序調(diào)用指令必須能將程序中斷位置的地址保存起來 一般都是自動將斷點(diǎn)地址放在堆棧中保存 78 在子程序中再調(diào)用其他子程序 稱為子程序嵌套 二層子程序嵌套過程如圖3 9 a 圖3 9 b 為二層子程序調(diào)用后 堆棧中斷點(diǎn)地址存放情況 調(diào)用和返回構(gòu)成了子程序調(diào)用的完整過程 為了實(shí)現(xiàn)這一過程 必須有調(diào)用指令和返回指令 調(diào)用指令在主程序中使用 而返回指令則是子程序中的最后一條指令 79 1 子程序調(diào)用指令LCALLaddr16 PC PC 3SP SP 1 SP PC 7 0SP SP 1 SP PC 15 8PC addr16ACALLaddr11 PC PC 2SP SP 1 SP PC 7 0SP SP 1 SP PC 15 8PC10 0 addr11LCALL指令稱為長調(diào)用指令 三字節(jié) addr16是子程序的16位入口地址 長調(diào)用指令調(diào)用范圍為64KB 80 ACALL指令稱為絕對調(diào)用指令 其指令格式為 a10a9a810001a7a6a5a4a3a2a1a0該指令的功能是 先將PC加2 指向下條指令地址 即斷點(diǎn)地址 然后將斷點(diǎn)地址壓入堆棧 再把指令中給出的子程序低11位入口地址裝入PC的低11位上 PC的高5位保持不變 使程序轉(zhuǎn)移到對應(yīng)的子程序入口處 絕對調(diào)用指令調(diào)用范圍為2KB 2 返回指令RET PC15 8 SP SP SP 1PC7 0 SP SP SP 1功能 從堆棧中自動取出斷點(diǎn)地址送入程序計(jì)數(shù)器PC 使程序返回到主程序斷點(diǎn)處繼續(xù)執(zhí)行 81 RETI PC15 8 SP SP SP 1PC7 0 SP SP SP 1RETI指令是中斷返回指令 放在中斷服務(wù)子程序的末尾 其功能也是從堆棧中自動取出斷點(diǎn)地址送入程序計(jì)數(shù)器PC 使程序返回到主程序斷點(diǎn)處繼續(xù)往下執(zhí)行 同時還清除中斷響應(yīng)時被置位的優(yōu)先級狀態(tài)觸發(fā)器 注意 RET和RETI不能互換使用 在子程序或中斷服務(wù)子程序中 PUSH指令和POP指令必須成對使用 否則 不能正確返回主程序斷點(diǎn)位置 82 3 6 4空操作指令NOP PC PC 1這是一條單字節(jié)指令 該指令不產(chǎn)生任何操作 只是使PC的內(nèi)容加1 指向下一條指令 它又是一條單周期指令 執(zhí)行時在時間上消耗一個機(jī)器周期 因此 NOP指令常用來實(shí)現(xiàn)等待或延時 83 MCS 51系列單片機(jī)其特色之一就是具有豐富的布爾變量處理功能 布爾變量即開關(guān)變量 它是以位 bit 為單位來進(jìn)行操作的 也稱為位變量 位操作指令是以進(jìn)位標(biāo)志CY作為位累加器 在位指令中直接用C表示 位操作類指令的對象 一是內(nèi)部RAM中的位尋址區(qū) 即20H 2FH中的128位 二是特殊功能寄存器中位尋址的各位 位地址在指令中都用bit表示 bit有四種表示形式 一是采用直接位地址表示 二是采用字節(jié)地址加位序號表示 三是采用位名稱表示 四是采用特殊功能寄存器加位序號表示 3 7位操作類指令 84 3 7 1位變量傳送指令MOVC bit CY bit MOVbit C bit CY 指令功能 以bit表示的位和CY之間進(jìn)行數(shù)據(jù)傳送 注意 兩個可尋址位之間沒有直接的傳送指令 例3 23將40H位的內(nèi)容傳送到20H位 解 傳送可以通過CY來進(jìn)行 但要注意保持原有CY的值不被破壞 MOV10H C 暫存CY內(nèi)容MOVC 40H 40H位的值送CYMOV20H C CY的值送20H位MOVC 10H 恢復(fù)CY內(nèi)容上述指令均屬位操作指令 因用CY作累加器 指令中的地址都是位地址 不是存儲單元的地址 85 3 7 2位置位 清零指令CLRC CY 0CLRbit bit 0SETBC CY 1SETBbit bit 1上述指令的功能是對CY及可尋址位進(jìn)行清零或置位操作 3 7 3位邏輯運(yùn)算指令A(yù)NLC bit CY CY bit ORLC bit CY CY bit 這兩條指令的功能是將CY的內(nèi)容與位地址中的內(nèi)容進(jìn)行邏輯與 或操作 結(jié)果送入CY中 86 ANLC bit CY CY ORLC bit CY CY 這兩條指令的功能同上 也是進(jìn)行與 或運(yùn)算 斜杠 表示將該位值取出后 先求反 再參加運(yùn)算 不改變位地址中原來的值 CPLC CY CPLbit bit 指令的功能 把CY或位地址中的內(nèi)容取反 在位操作指令中 沒有位的異或運(yùn)算 如果需要 可通過上述位操作指令實(shí)現(xiàn) 87 例3 24設(shè)E B D都代表位地址 試編寫程序完成E B內(nèi)容的異或操作 并將結(jié)果存入D中 解 可直接按D E B來編寫 MOVC B 從位地址中取數(shù)送CYANLC E CY B MOVD C 暫存MOVC E 取另一個操作數(shù)ANLC B CY E ORLC D 進(jìn)行E B運(yùn)算MOVD C 運(yùn)算結(jié)果存D位利用位邏輯運(yùn)算指令 可以獲得組合電路邏輯功能 88 3 7 4位控制轉(zhuǎn)移指令位控制轉(zhuǎn)移指令都是條件轉(zhuǎn)移指令 它以CY或位地址bit的內(nèi)容作為轉(zhuǎn)移的判斷條件 1 以CY為條件的轉(zhuǎn)移指令JCrel 若 CY 1 則轉(zhuǎn)移 PC PC 2 rel若 CY 1 按順序執(zhí)行 PC PC 2JNCrel 若 CY 0 則轉(zhuǎn)移 PC PC 2 rel若 CY 0 按順序執(zhí)行 PC PC 2 89 2 以位狀態(tài)為條件的轉(zhuǎn)移指令JBbit rel 若 bit 1 轉(zhuǎn)移 PC PC 3 rel若 bit 1 順序執(zhí)行 PC PC 3JNBbit rel 若 bit 0 轉(zhuǎn)移 PC PC 3 rel若 bit 0 順序執(zhí)行 PC PC 3JBCbit rel 若 bit 1 轉(zhuǎn)移 PC PC 3 rel 同時bit 0若 bit 1 順序執(zhí)行 PC PC 3注意 JB和JBC指令的區(qū)別 兩者轉(zhuǎn)移的條件相同 所不同的是JBC指令在轉(zhuǎn)移的同時 還能將直接尋址位清0 即一條JBC指令相當(dāng)于兩條指令的功能 90 例3 25試編程 在8051的P1 7位輸出一個方波 方波周期為6個機(jī)器周期 SETBP1 7 使P1 7位輸出 1 電平NOP 延時2個機(jī)器周期NOPCLRP1 7 使P1 7位輸出 0 電平NOP 延時2個機(jī)器周期NOPSETBP1 7 使P1 7位輸出 1 電平SJMP 暫停若在P1 7位輸出連續(xù)方波 應(yīng)如何修改程序 請?jiān)嚲幊?LOOP LOOP 91 例3 26試分析 執(zhí)行完以下程序 程序?qū)⑥D(zhuǎn)至何處 ANLP1 00H P1 00HJBP1 6 LP1 因P1 6 0 程序按順序執(zhí)行JNBP1 0 LP2 因P1 0 0 程序發(fā)生轉(zhuǎn)移 轉(zhuǎn)至LP2 LP1 LP2 使用位操作指令可以使程序設(shè)計(jì)變得更加方便和靈活- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuà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ì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- MCS 51 系列 單片機(jī) 指令系統(tǒng)
鏈接地址:http://m.jqnhouse.com/p-6381130.html