MCS-C51的指令系統(tǒng).ppt
《MCS-C51的指令系統(tǒng).ppt》由會員分享,可在線閱讀,更多相關(guān)《MCS-C51的指令系統(tǒng).ppt(91頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
2020年2月24日星期一 1 單片機(jī)原理及應(yīng)用 主講 梁德勝聯(lián)系方式 dsliang 辦公地點(diǎn) 教五樓408室 2020年2月24日星期一 2 常用的編程語言 1 機(jī)器語言機(jī)器語言是用二進(jìn)制代碼表示的計(jì)算機(jī)能直接識別和執(zhí)行的一種機(jī)器指令的集合 機(jī)器語言具有靈活 直接執(zhí)行和速度快等特點(diǎn) 用機(jī)器語言編寫程序 編程人員要首先熟記所用計(jì)算機(jī)的全部指令代碼和代碼的涵義 手編程序時(shí) 程序員得自己處理每條指令和每一數(shù)據(jù)的存儲分配和輸入輸出 還得記住編程過程中每步所使用的工作單元處在何種狀態(tài) 而且 編出的程序全是些0和1的指令代碼 直觀性差 還容易出錯(cuò) 2020年2月24日星期一 3 2 匯編語言為了克服機(jī)器語言難讀 難編 難記和易出錯(cuò)的缺點(diǎn) 人們就用與代碼指令實(shí)際含義相近的英文縮寫詞 字母和數(shù)字等符號來取代指令代碼 于是就產(chǎn)生了匯編語言 所以說 匯編語言是一種用助記符表示的仍然面向機(jī)器的計(jì)算機(jī)語言 匯編語言亦稱符號語言 匯編語言由于是采用了助記符號來編寫程序 比用機(jī)器語言的二進(jìn)制代碼編程要方便些 在一定程度上簡化了編程過程 匯編語言的特點(diǎn)是用符號代替了機(jī)器指令代碼 而且助記符與指令代碼一一對應(yīng) 基本保留了機(jī)器語言的靈活性 使用匯編語言能面向機(jī)器并較好地發(fā)揮機(jī)器的特性 得到質(zhì)量較高的程序 匯編語言中由于使用了助記符號 計(jì)算機(jī)不能象用機(jī)器語言編寫的程序一樣直接識別和執(zhí)行 必須通過預(yù)先放入計(jì)算機(jī)的 匯編程序 的加工和翻譯 才能變成能夠被計(jì)算機(jī)識別和處理的二進(jìn)制代碼程序 匯編語言像機(jī)器指令一樣 是硬件操作的控制信息 因而仍然是面向機(jī)器的語言 使用起來還是比較繁瑣費(fèi)時(shí) 通用性也差 匯編語言是低級語言 但是 匯編語言用來編制系統(tǒng)軟件和過程控制軟件 其目標(biāo)程序占用內(nèi)存空間少 運(yùn)行速度快 有著高級語言不可替代的用途 2020年2月24日星期一 4 3 高級語言不論是機(jī)器語言還是匯編語言都是面向硬件的具體操作的 語言對機(jī)器的過分依賴 要求使用者必須對硬件結(jié)構(gòu)及其工作原理都十分熟悉 高級語言是面向用戶的語言 無論何種機(jī)型的計(jì)算機(jī) 只要配備上相應(yīng)的高級語言的編譯或解釋程序 則用該高級語言編寫的程序就可以通用 計(jì)算機(jī)并不能直接地接受和執(zhí)行用高級語言編寫的源程序 源程序在輸入計(jì)算機(jī)時(shí) 通過 翻譯程序 翻譯成機(jī)器語言形式的目標(biāo)程序 計(jì)算機(jī)才能識別和執(zhí)行 每一種高級語言 都有自己規(guī)定的專用符號 英文單詞 語法規(guī)則和語句結(jié)構(gòu) 高級語言與自然語言更接近 而與硬件功能相分離 便于廣大用戶掌握和使用 高級語言的通用性強(qiáng) 兼容性好 便于移植 2020年2月24日星期一 5 第3章MCS 51指令系統(tǒng) 3 1指令格式及常用符號3 2MCS 51的尋址方式3 3數(shù)據(jù)傳送類指令 29條 3 4算術(shù)運(yùn)算類指令 24條 3 5邏輯運(yùn)算與循環(huán)類指令 24條 3 6位操作類指令 17條 3 7控制轉(zhuǎn)移類指令 17條 2020年2月24日星期一 6 3 1指令格式及常用符號 3 1 1機(jī)器指令的編碼格式一 單字節(jié)指令1 8位編碼僅為操作碼 如 INCA該指令的編碼為 00000100B 其十六進(jìn)制表示為04H 累加器A隱含在操作碼中 指令的功能是累加器A的內(nèi)容加1 注意 在指令中用 A 表示累加器 而用 ACC 表示累加器對應(yīng)的地址 E0H 指令要指明操作和操作對象 2020年2月24日星期一 7 2 8位編碼含有操作碼和寄存器編碼高5位為操作碼 低3位為存放操作數(shù)的寄存器編碼 如 MOVA R0編碼為11101000B 其十六進(jìn)制表示為E8H 低3位000為寄存器R0的編碼 功能是將當(dāng)前工作寄存器R0中的數(shù)據(jù)傳送到累加器A中 如何知道是哪一組寄存器 2020年2月24日星期一 8 二 雙字節(jié)指令第一字節(jié)表示操作碼 第二個(gè)字節(jié)表示參與操作的數(shù)據(jù)或數(shù)據(jù)存放的地址 如 MOVA 50H編碼為01110100B 01010000B 其十六進(jìn)制表示為74H 50H 功能是將立即數(shù) 50H 傳送到累加器A中 注意 指令中帶 的是立即數(shù) 不帶 的是地址 50H是存儲在程序區(qū)還是數(shù)據(jù)區(qū) 2020年2月24日星期一 9 三 三字節(jié)指令指令的第一字節(jié)表示該指令的操作碼 后兩個(gè)字節(jié)表示參與操作的數(shù)據(jù)或數(shù)據(jù)存放的地址 如 MOV20H 50H編碼為01110101B 00100000B 01010000B 其十六進(jìn)制表示為75H 20H 50H 功能是將立即數(shù) 50H 傳送到內(nèi)部RAM的20H單元中 如何知道是傳輸?shù)絻?nèi)部RAM中 2020年2月24日星期一 10 3 1 2符號指令的格式一般格式為 操作助記符 目的操作數(shù) 源操作數(shù) 注釋 多數(shù)指令為兩操作數(shù)指令 當(dāng)指令操作數(shù)隱含在操作助記符中時(shí) 在形式上這種指令無操作數(shù) 另有一些指令為單操作數(shù)指令或三操作數(shù)指令 指令的一般格式中使用了可選擇符號 包含的內(nèi)容因指令的不同可以有或無 在兩個(gè)操作數(shù)的指令中 通常目的操作數(shù)寫在左邊 源操作數(shù)寫在右邊 2020年2月24日星期一 11 如 指令A(yù)NLA 40H功能是將立即數(shù) 40H 同累加器A中的數(shù)進(jìn)行 與 操作 結(jié)果送回累加器 ANL為 與 操作的助記符 立即數(shù) 40H 為源操作數(shù) 累加器A為目的操作數(shù) 注 在指令中 多數(shù)情況下累加器用 A 表示 僅在直接尋址方式中 用 ACC 表示累加器在SFR區(qū)的具體地址E0H 試比較 指令MOVA 30H的機(jī)器碼為74H 30H 而指令MOVACC 30H的機(jī)器碼為75H E0H 30H 兩個(gè)指令的執(zhí)行效率是不一樣的前一個(gè)為單周期指令而后一個(gè)為雙周期指令 2020年2月24日星期一 12 3 1 3符號指令及其注釋中常用的符號Rn n 0 7 當(dāng)前選中的工作寄存器組中的寄存器R0 R7之一 Ri i 0 1 當(dāng)前選中的工作寄存器組中的寄存器R0或R1 間址寄存器前綴 data 8位立即數(shù) data16 16位立即數(shù) direct 片內(nèi)低128個(gè)RAM單元地址及SFR地址 可用符號名稱表示 2020年2月24日星期一 13 addr11 11位目的地址 addr16 16位目的地址 rel 補(bǔ)碼形式表示的8位地址偏移量 值在 128 127范圍內(nèi) bit 片內(nèi)RAM位地址 SFR的位地址 可用符號名稱表示 位操作數(shù)的取反操作前綴 表示 地址單元或寄存器中的內(nèi)容 表示以 單元或寄存器內(nèi)容為地址間接尋址單元的內(nèi)容 將箭頭右邊的內(nèi)容送入箭頭左邊的單元中 2020年2月24日星期一 14 3 2MCS 51的尋址方式 尋址方式是尋找操作數(shù)或指令的地址的方式 尋址方式包含兩方面內(nèi)容 一是操作數(shù)的尋址 二是指令地址的尋址 如轉(zhuǎn)移指令 調(diào)用指令 尋址方式有七種 即 寄存器尋址 直接尋址 寄存器間接尋址 立即尋址 基址寄存器加變址寄存器變址尋址 相對尋址和位尋址對于兩操作數(shù)指令 源操作數(shù)有尋址方式 目的操作數(shù)也有尋址方式 若不特別聲明 我們后面提到的尋址方式均指源操作數(shù)的尋址方式 2020年2月24日星期一 15 2020年2月24日星期一 16 操作數(shù)存放在寄存器中 指令中直接給出該寄存器名稱的尋址方式稱為寄存器尋址 采用寄存器尋址可以獲得較高的傳送和運(yùn)算速度 寄存器可以是 R0 R7 累加器A 注 使用符號ACC表示累加器時(shí)屬于直接尋址 寄存器B 以A B寄存器對形式出現(xiàn) 數(shù)據(jù)指針DPTR 3 2 1寄存器尋址 如 MOVA R0 2020年2月24日星期一 17 指令操作碼之后的字節(jié)存放的是操作數(shù)的地址 操作數(shù)本身存放在該地址指示的存儲單元中的尋址方式稱為直接尋址 在直接尋址方式中的SFR經(jīng)常采用符號形式表示 尋址空間為 片內(nèi)RAM低128字節(jié) 以地址形式表示 SFR 以地址或SFR的符號形式表示 3 2 2直接尋址 如 MOVA 50H 注 直接尋址是特殊功能寄存器唯一的訪問方式 2020年2月24日星期一 18 寄存器中的內(nèi)容為地址 從該地址去取操作數(shù)的尋址方式稱為寄存器間接尋址 寄存器間接尋址的存儲空間為片內(nèi)RAM或片外RAM 片內(nèi)RAM的數(shù)據(jù)傳送采用 MOV 類指令 間接尋址寄存器采用寄存器R0或R1 堆棧操作時(shí)采用SP 片外RAM的數(shù)據(jù)傳送采用 MOVX 類指令 這時(shí)間接尋址寄存器有兩種選擇 一是采用R0和R1作間址寄存器 這時(shí)R0或R1提供低8位地址 由P2口提供高8位地址 二是采用DPTR作為間址寄存器 3 2 3寄存器間接尋址 注意 訪問片內(nèi)片外RAM的MOV指令不同 2020年2月24日星期一 19 寄存器間接尋址對應(yīng)的空間為 片內(nèi)RAM 采用 R0 R1或SP 片外RAM 采用 R0 R1或 DPTR 如 MOVA R0 2020年2月24日星期一 20 指令編碼中直接給出操作數(shù)的尋址方式稱為立即尋址 在這種尋址方式中 緊跟在操作碼之后的操作數(shù)稱為立即數(shù) 立即數(shù)可以為一個(gè)字節(jié) 也可以是兩個(gè)字節(jié) 并要用符號 來標(biāo)識 由于立即數(shù)是一個(gè)常數(shù) 所以只能作為源操作數(shù) 立即尋址所對應(yīng)的尋址空間為 ROM 3 2 4立即尋址 如 MOVA 50H 2020年2月24日星期一 21 以一個(gè)基地址加上一個(gè)偏移量地址形成操作數(shù)地址的尋址方式稱為變址尋址 在這種尋址方式中 以數(shù)據(jù)指針DPTR或程序計(jì)數(shù)器PC作為基址寄存器 累加器A作為偏移量寄存器 基址寄存器的內(nèi)容與偏移量寄存器的內(nèi)容之和作為操作數(shù)地址 變址尋址所對應(yīng)的尋址空間為 ROM 3 2 5變址尋址 如 MOVCA A DPTR 2020年2月24日星期一 22 相對尋址是以程序計(jì)數(shù)器PC的當(dāng)前值 指讀出該2字節(jié)或3字節(jié)的跳轉(zhuǎn)指令后 PC指向的下條指令的地址 為基準(zhǔn) 加上指令中給出的相對偏移量rel形成目標(biāo)地址的尋址方式 rel是一個(gè)帶符號的8位二進(jìn)制數(shù) 取值范圍是 128 127 以補(bǔ)碼形式置于操作碼之后存放 3 2 6相對尋址 如 JCrel rel 75H 2020年2月24日星期一 23 對位地址中的內(nèi)容進(jìn)行操作的尋址方式稱為位尋址 采用位尋址指令的操作數(shù)是8位二進(jìn)制數(shù)中的某一位 指令中給出的是位地址 位尋址方式實(shí)質(zhì)屬于位的直接尋址 尋址空間為 片內(nèi)RAM的20H 2FH單元中的128可尋址位 SFR的可尋址位 習(xí)慣上 特殊功能寄存器的尋址位常用符號位地址表示 如 CLRACC 0MOV30H C 3 2 7位尋址 注意 如何來區(qū)分是位地址還是字節(jié)地址是通過指令來判斷 2020年2月24日星期一 24 3 3數(shù)據(jù)傳送類指令 29條 傳送類指令占有較大的比重 數(shù)據(jù)傳送是進(jìn)行數(shù)據(jù)處理的最基本的操作 這類指令一般不影響標(biāo)志寄存器PSW的狀態(tài) 傳送類指令可以分成兩大類 一是采用MOV操作符 稱為一般傳送指令 二是采用非MOV操作符 稱為特殊傳送指令 如 MOVC MOVX PUSH POP XCH XCHD及SWAP 2020年2月24日星期一 25 3 3 1一般傳送指令 圖3 1MCS 51傳送指令示意圖 2020年2月24日星期一 26 3 3 1一般傳送指令 2020年2月24日星期一 27 一 16位傳送這條指令的功能是將源操作數(shù)data16 通常是地址常數(shù) 送入目的操作數(shù)DPTR中 源操作數(shù)的尋址方式為立即尋址 例如 執(zhí)行指令MOVDPTR 1234H后 DPH 12H DPL 34H 2020年2月24日星期一 28 二 8位傳送 在5種源字節(jié)中 只有 data不能用作目的字節(jié) 所以可以用4種目的字節(jié)為基礎(chǔ)構(gòu)造4類指令 相應(yīng)的源字節(jié)選擇依據(jù)是 源字節(jié)與目的字節(jié)不相同 寄存器尋址與寄存器間接尋址間不相互傳送 指的是工作寄存器 寄存器尋址與寄存器間接尋址間及其本身之間都不相互傳送 2020年2月24日星期一 29 1 以A為目的 這組指令的功能是把源字節(jié)送入累加器中 源字節(jié)的尋址方式分別為直接尋址 寄存器間接尋址 寄存器尋址和立即尋址四種基本尋址方式 例 若 R1 20H 20H 55H 執(zhí)行指令MOVA R1后 A 55H 2020年2月24日星期一 30 2 以Rn為目的 這組指令的功能是把源字節(jié)送入寄存器Rn中 源字節(jié)的尋址方式分別為立即尋址 直接尋址和寄存器尋址 由于目的字節(jié)為工作寄存器 所以源字節(jié)不能是工作寄存器及其間址方式尋址 例 若 50H 40H 執(zhí)行指令MOVR6 50H后 R6 40H 2020年2月24日星期一 31 3 以direct為目的 這組指令的功能是把源字節(jié)送入direct中 源字節(jié)的尋址方式分別為立即尋址 直接尋址 寄存器間接尋址和寄存器尋址 例 若 R1 50H 50H 18H 執(zhí)行指令MOV40H R1后 40H 18H 2020年2月24日星期一 32 4 以 Ri為目的 這組指令的功能是把源字節(jié)送入Ri內(nèi)容為地址的單元 源字節(jié)尋址方式為立即尋址 直接尋址和寄存器尋址 因目的字節(jié)采用寄存器間接尋址 故源字節(jié)不能是寄存器及其間址尋址 例 若 R1 30H A 20H 執(zhí)行指令MOV R1 A后 30H 20H 2020年2月24日星期一 33 3 3 2特殊傳送指令 特殊傳送指令的操作符為 MOVC MOVX PUSH POP XCH XCHD和SWAP 功能分別為 ROM查表 外部RAM讀寫 堆棧操作和交換指令 2020年2月24日星期一 34 2020年2月24日星期一 35 一 ROM查表1 DPTR內(nèi)容為基址MOVCA A DPTR A A DPTR 該指令首先執(zhí)行16位無符號數(shù)加法 將獲得的基址與變址之和作為16位的程序存儲器地址 然后將該地址單元的內(nèi)容傳送到累加器A 指令執(zhí)行后DPTR的內(nèi)容不變 2 PC內(nèi)容為基址MOVCA A PC A A PC 取出該單字節(jié)指令后PC的內(nèi)容增1 以增1后的當(dāng)前值去執(zhí)行16位無符號數(shù)加法 將獲得的基址與變址之和作為16位的程序存儲器地址 然后將該地址單元的內(nèi)容傳送到累加器A 指令執(zhí)行后PC的內(nèi)容不變 2020年2月24日星期一 36 二 讀寫片外RAM1 讀片外RAMMOVXA DPTR A DPTR MOVXA Ri A Ri 第一條指令以16位DPTR為間址寄存器讀片外RAM 可以尋址整個(gè)64K字節(jié)的片外RAM空間 指令執(zhí)行時(shí) 在DPH中的高8位地址由P2口輸出 在DPL中的低8位地址由P0口分時(shí)輸出 并由ALE信號鎖存在地址鎖存器中 第二條指令以R0或R1為間址寄存器 也可以讀整個(gè)64K字節(jié)的片外RAM空間 指令執(zhí)行時(shí) 低8位地址在R0或R1中由P0口分時(shí)輸出 ALE信號將地址信息鎖存在地址鎖存器中 高8位地址由P2口提供 讀片外RAM的MOVX操作 使P3 7引腳輸出的信號選通片外RAM單元 相應(yīng)單元的數(shù)據(jù)從P0口讀入累加器中 2020年2月24日星期一 37 2 寫片外RAMMOVX DPTR A DPTR A MOVX Ri A Ri A 第一條指令以16位DPTR為間址寄存器寫外部RAM 可以尋址整個(gè)64K字節(jié)的片外RAM空間 指令執(zhí)行時(shí) 在DPH中高8位地址由P2口輸出 在DPL中的低8位地址 由P0口分時(shí)輸出 并由ALE信號鎖存在地址鎖存器中 第二條指令以R0或R1為間址寄存器 也可以寫整個(gè)64K字節(jié)的片外RAM空間 指令執(zhí)行時(shí) 低8位地址在R0或R1中由P0口分時(shí)輸出 ALE信號將地址信息鎖存在地址鎖存器中 高8位地址由P2口提供 寫片外RAM的 MOVX 操作 使P3 6引腳的信號有效 累加器A的內(nèi)容從P0口輸出并寫入選通的相應(yīng)片外RAM單元 注 當(dāng)片外擴(kuò)展的I O端口映射為片外RAM地址時(shí) 也要利用這4條指令進(jìn)行數(shù)據(jù)的輸入輸出 2020年2月24日星期一 38 三 堆棧操作堆棧是在內(nèi)部RAM中按 后進(jìn)先出 的規(guī)則組織的一片存儲區(qū) 此區(qū)的一端固定 稱為棧底 另一端是活動(dòng)的 稱為棧頂 棧頂?shù)奈恢?地址 由棧指針SP指示 即SP的內(nèi)容是棧頂?shù)牡刂?在80C51中 堆棧的生長方向是向上的 地址增大 系統(tǒng)復(fù)位時(shí) SP的內(nèi)容為07H 通常用戶應(yīng)在系統(tǒng)初始化時(shí)對SP重新設(shè)置 SP的值越小 堆棧的深度越深 PUSHdirect SP SP 1 SP direct POPdirect direct SP SP SP 1例 若 SP 07H 40H 88H 執(zhí)行指令PUSH40H后 SP 08H 08H 88H 2020年2月24日星期一 39 四 數(shù)據(jù)交換對于單一的MOV類指令 傳送通常是單向的 即數(shù)據(jù)是從一處 源 到另一處 目的 的拷貝 而交換類指令完成的傳送是雙向的 是兩字節(jié)間或兩半字節(jié)間的雙向交換 1 字節(jié)交換 例 若 R0 80H A 20H 執(zhí)行指令XCHA R0后 A 80H R0 20H 2020年2月24日星期一 40 2 半字節(jié)交換 XCHD指令的功能是間址操作數(shù)的低半字節(jié)與A的低半字節(jié)內(nèi)容互換 SWAP指令的功能是累加器的高低4位互換 例 若 R0 30H 30H 67H A 20H 執(zhí)行指令XCHDA R0指令后 A 27H 30H 60H 若 A 30H 執(zhí)行指令SWAPA后 A 03H 2020年2月24日星期一 41 3 4算術(shù)運(yùn)算類指令 24條 算術(shù)運(yùn)算指令可以完成加 減 乘 除及加1和減1等運(yùn)算 這類指令多數(shù)以A為源操作數(shù)之一 同時(shí)又使A為目的操作數(shù) 2020年2月24日星期一 42 2020年2月24日星期一 43 進(jìn)位 借位 標(biāo)志CY為無符號整數(shù)的多字節(jié)加法 減法 移位等操作提供了方便 溢出標(biāo)志OV可方便的控制補(bǔ)碼運(yùn)算 輔助進(jìn)位標(biāo)志AC用于BCD碼運(yùn)算 算術(shù)運(yùn)算操作將影響PSW中的OV CY AC和P等 2020年2月24日星期一 44 3 4 1加法 一 不帶進(jìn)位加 CY 和的D7位有進(jìn)位時(shí) CY 1 否則 CY 0 AC 和的D3位有進(jìn)位時(shí) AC 1 否則 AC 0 OV 和的D7 D6位只有一個(gè)有進(jìn)位時(shí) OV 1 溢出表示運(yùn)算的結(jié)果超出了數(shù)值所允許的范圍 如 兩個(gè)正數(shù)相加結(jié)果為負(fù)數(shù)或兩個(gè)負(fù)數(shù)相加結(jié)果為正數(shù)時(shí)屬于錯(cuò)誤結(jié)果 此時(shí) OV 1 P 累加器ACC中 1 的個(gè)數(shù)為奇數(shù)時(shí) P 1 為偶數(shù)時(shí) P 0 11001100 01001000 100010100 2020年2月24日星期一 45 例若 A 84H 30H 8DH 執(zhí)行指令A(yù)DDA 30H之后 由于 即 A 11H CY 1 AC 1 OV 1 D7有進(jìn)位 D6無進(jìn)位 P 0 2020年2月24日星期一 46 二 帶進(jìn)位加 指令的功能是把源操作數(shù)與累加器A的內(nèi)容相加再與進(jìn)位標(biāo)志CY的值相加 結(jié)果送入目的操作數(shù)A中 加的進(jìn)位標(biāo)志CY的值是在該指令執(zhí)行之前已經(jīng)存在的進(jìn)位標(biāo)志的值 而不是執(zhí)行該指令過程中產(chǎn)生的進(jìn)位 2020年2月24日星期一 47 三 增1 指令的功能是把源操作數(shù)的內(nèi)容加1 結(jié)果再送回原單元 這些指令僅INCA影響P標(biāo)志 其余指令都不影響標(biāo)志位的狀態(tài) 2020年2月24日星期一 48 二 十進(jìn)制編碼 BCD碼BCD Binary CodedDecimal 碼又稱為 二 十進(jìn)制編碼 專門解決用二進(jìn)制數(shù)表示十進(jìn)數(shù)的問題 最常用的是8421編碼 其方法是用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù) 自左至右每一位對應(yīng)的位權(quán)是8 4 2 1 1 壓縮BCD碼壓縮BCD碼的每一位用4位二進(jìn)制表示 0000 1001表示0 9 一個(gè)字節(jié)表示兩位十進(jìn)制數(shù) 例如 二進(jìn)制數(shù)1000 1001B 采用壓縮BCD碼表示為十進(jìn)制數(shù)89D 2 非壓縮BCD碼非壓縮BCD碼用一個(gè)字節(jié)表示一位十進(jìn)制數(shù) 高4位總是0000 低4位的0000 1001表示0 9 例如 十進(jìn)制數(shù)89D 采用非壓縮BCD碼表示為二進(jìn)制數(shù)是 0000100000001001B 2020年2月24日星期一 49 四 十進(jìn)制調(diào)整DAA指令的功能是對累加器A中剛進(jìn)行的兩個(gè)BCD碼的加法的結(jié)果進(jìn)行十進(jìn)制調(diào)整 兩個(gè)壓縮的BCD碼按二進(jìn)制相加后 必須經(jīng)過調(diào)整方能得到正確的壓縮BCD碼的和 調(diào)整要完成的任務(wù)是 1 當(dāng)累加器A中的低4位數(shù)出現(xiàn)了非BCD碼 1010 1111 或低4位產(chǎn)生進(jìn)位 AC 1 則應(yīng)在低4位加6調(diào)整 以產(chǎn)生低4位正確的BCD結(jié)果 2 當(dāng)累加器A中的高4位數(shù)出現(xiàn)了非BCD碼 1010 1111 或高4位產(chǎn)生進(jìn)位 CY 1 則應(yīng)在高4位加6調(diào)整 以產(chǎn)生高4位正確的BCD結(jié)果 十進(jìn)制調(diào)整指令執(zhí)行后 PSW中的CY表示結(jié)果的百位值 2020年2月24日星期一 50 例若 A 01010110B 表示的BCD碼為 56 BCD R2 01100111B 表示的BCD碼為 67 BCD CY 0 執(zhí)行以下指令 ADDA R2DAA得到 A 00100011B 即 23 BCD 且 CY 1 即 結(jié)果為BCD數(shù)123 應(yīng)該注意 DA指令不能對減法進(jìn)行十進(jìn)制調(diào)整 2020年2月24日星期一 51 3 4 2減法 一 帶借位減 CY 差的位7需借位時(shí) CY 1 否則 CY 0 AC 差的位3需借位時(shí) AC 1 否則 AC 0 OV 若位6有借位而位7無借位或位7有借位而位6無借位時(shí) OV 1 注意 如要用此組指令完成不帶借位減法 只需先清CY為0 第一次進(jìn)行減法時(shí)CY應(yīng)清零 2020年2月24日星期一 52 例若 A C9H R2 54H CY 1 執(zhí)行指令SUBBA R2之后 由于 即 A 74H CY 0 AC 0 OV 1 位6有借位 位7無借位 P 0 2020年2月24日星期一 53 二 減1 這組指令的功能是把操作數(shù)的內(nèi)容減1 結(jié)果再送回原單元 這組指令僅DECA影響P標(biāo)志 其余指令都不影響標(biāo)志位的狀態(tài) 2020年2月24日星期一 54 3 4 3乘法 MULAB 累加器A與B寄存器相乘該指令的功能是將累加器A與寄存器B中的無符號8位二進(jìn)制數(shù)相乘 乘積的低8位留在累加器A中 高8位存放在寄存器B中 當(dāng)乘積大于FFH時(shí) 溢出標(biāo)志位 OV 1 而標(biāo)志CY總是被清0 例若 A 50H B A0H 執(zhí)行指令MULAB之后 A 00H B 32H OV 1 CY 0 2020年2月24日星期一 55 3 4 4除法 DIVAB 累加器A除以寄存器B該指令的功能是將累加器A中的無符號8位二進(jìn)制數(shù)除以寄存器B中的無符號8位二進(jìn)制數(shù) 商的整數(shù)部分存放在累加器A中 余數(shù)部分存放在寄存器B中 當(dāng)除數(shù)為0時(shí) 則結(jié)果的A和B的內(nèi)容不定 且溢出標(biāo)志位 OV 1 而標(biāo)志CY總是被清0 例若 A FBH 251 B 12H 18 執(zhí)行指令DIVAB之后 A 0DH B 11H OV 0 CY 0 2020年2月24日星期一 56 MOV23H 30HMOV12H 34HMOVR0 23HMOVR7 22HMOVR1 12HMOVA R0MOV34H R1 23H 30H 12H 34H R0 23H R7 22H R1 12H A 30H 34H 34H 執(zhí)行程序前sp 07H 2020年2月24日星期一 57 MOV45H 34HMOVDPTR 6712HMOV12H DPHMOVR0 DPLMOVA R0PUSH12HPUSH45HPOP60HPOP70H 45H 34H DPTR 6712H 12H 67H R0 12H A 67H 08H 67H 09H 34H 60H 34H 70H 67H 12H 67H 45H 34H 2020年2月24日星期一 58 3 5邏輯運(yùn)算與循環(huán)類指令 24條 邏輯運(yùn)算指令可以完成與 或 異或 清0和取反操作 當(dāng)以累加器A為目的操作數(shù)時(shí) 對P標(biāo)志有影響 循環(huán)指令是對累加器A的循環(huán)移位操作 包括左 右方向以及帶與不帶進(jìn)位位等移位方式 移位操作時(shí) 帶進(jìn)位的循環(huán)移位對CY和P標(biāo)志有影響 累加器清0操作對P標(biāo)志有影響 2020年2月24日星期一 59 2020年2月24日星期一 60 2020年2月24日星期一 61 3 5 1邏輯與 前2條指令的功能是把源操作數(shù)與直接地址指示的單元內(nèi)容相與 結(jié)果送入直接地址指示的單元 后4條指令的功能是把源操作數(shù)與累加器A的內(nèi)容相與 結(jié)果送入累加器A中 例若 A C3H R0 AAH 執(zhí)行指令A(yù)NLA R0之后 A 82H 2020年2月24日星期一 62 前2條指令的功能是把源操作數(shù)與直接地址指示的單元內(nèi)容相或 結(jié)果送入直接地址指示的單元 后4條指令的功能是把源操作數(shù)與累加器A的內(nèi)容相或 結(jié)果送入累加器A中 例若 A C3H R0 55H 執(zhí)行指令ORLA R0之后 A D7H 3 5 2邏輯或 2020年2月24日星期一 63 3 5 3邏輯異或 前2條指令的功能是把源操作數(shù)與直接地址指示的單元內(nèi)容異或 結(jié)果送入直接地址指示的單元 后4條指令的功能是把源操作數(shù)與累加器A的內(nèi)容異或 結(jié)果送入累加器A中 例若 A C3H R0 AAH 執(zhí)行指令XRLA R0之后 A 69H 2020年2月24日星期一 64 3 5 4累加器清0和取反 A 0 A 這兩條指令的功能分別是把累加器A的內(nèi)容清0和取反 結(jié)果仍在A中 例若 A A5H 執(zhí)行指令CLRA之后 A 00H 2020年2月24日星期一 65 3 5 5累加器循環(huán)移位 2020年2月24日星期一 66 有時(shí) 累加器A內(nèi)容乘2 的任務(wù)可以利用指令RLCA方便地完成 例 若 A BDH 10111101B CY 0 執(zhí)行指令RLCA后 CY 1 A 01111010B 7AH CY 1 結(jié)果為 17AH 378 2 BDH 189 2020年2月24日星期一 67 3 6位操作類指令 17條 位操作又稱布爾操作 它是以位為單位進(jìn)行的各種操作 位操作指令中的位地址有4種表示形式 直接地址方式 如 0D5H 點(diǎn)操作符方式 如 0D0H 5 PSW 5等 位名稱方式 如 F0 偽指令定義方式 如 MYFLAGBITF0 以上幾種形式表示的都是PSW中的位5 與字節(jié)操作指令中累加器ACC用字符 A 表示類似的是 在位操作指令中 位累加器要用字符 C 表示 注 在位操作指令中CY與具體的直接位地址D7H對應(yīng) 2020年2月24日星期一 68 1 1 2020年2月24日星期一 69 MOVbit C bit CY MOVC bit CY bit 這兩條指令可以實(shí)現(xiàn)指定位地址中的內(nèi)容與位累加器CY的內(nèi)容的相互傳送 例若 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 3 6 1位傳送 2020年2月24日星期一 70 一 位清0這兩條指令可以實(shí)現(xiàn)位地址內(nèi)容和位累加器內(nèi)容的清0 例若 P1 10011101B 執(zhí)行指令CLRP1 3后 結(jié)果為 P1 10010101B 3 6 2位狀態(tài)設(shè)置 2020年2月24日星期一 71 二 位置位這兩條指令可以實(shí)現(xiàn)地址內(nèi)容和位累加器內(nèi)容的置位 例若 P1 10011100B 執(zhí)行指令SETBP1 0后 P1 10011101B 2020年2月24日星期一 72 一 位邏輯 與 這兩條指令可以實(shí)現(xiàn)位地址單元內(nèi)容或取反后的值與位累加器的內(nèi)容 與 操作 操作的結(jié)果送位累加器C 例若 P1 10011100B CY 1 執(zhí)行指令A(yù)NLC P1 0后 結(jié)果為 P1內(nèi)容不變 而 CY 0 3 6 3位邏輯運(yùn)算 2020年2月24日星期一 73 二 位邏輯 或 這兩條指令可以實(shí)現(xiàn)位地址單元內(nèi)容或取反后的值與位累加器的內(nèi)容 或 操作 操作的結(jié)果送位累加器C 2020年2月24日星期一 74 三 位取反這兩條指令可以實(shí)現(xiàn)位地址單元內(nèi)容和位累加器內(nèi)容的取反 2020年2月24日星期一 75 一 判CY轉(zhuǎn)移這兩條指令的功能是對進(jìn)位標(biāo)志位CY進(jìn)行檢測 當(dāng) CY 1 第一條指令 或 CY 0 第二條指令 程序轉(zhuǎn)向PC當(dāng)前值與rel之和的目標(biāo)地址去執(zhí)行 否則程序?qū)㈨樞驁?zhí)行 3 6 4位判跳 條件轉(zhuǎn)移 2020年2月24日星期一 76 二 判bit轉(zhuǎn)移這三條指令的功能是對指定位bit進(jìn)行檢測 當(dāng) bit 1 第一和第二條指令 或 bit 0 第三條指令 程序轉(zhuǎn)向PC當(dāng)前值與rel之和的目標(biāo)地址去執(zhí)行 否則程序?qū)㈨樞驁?zhí)行 對于第二條指令 當(dāng)條件滿足時(shí) 指定位為1 還具有將該指定位清0的功能 2020年2月24日星期一 77 3 7控制轉(zhuǎn)移類指令 17條 通常情況下 程序的執(zhí)行是順序進(jìn)行的 但也可以根據(jù)需要改變程序的執(zhí)行順序 這種情況稱作程序轉(zhuǎn)移 控制程序的轉(zhuǎn)移要利用轉(zhuǎn)移指令 8051的轉(zhuǎn)移指令有無條件轉(zhuǎn)移 條件轉(zhuǎn)移及子程序調(diào)用與返回等 2020年2月24日星期一 78 2020年2月24日星期一 79 一 短跳轉(zhuǎn)AJMPaddr11 PC PC 2 PC10 0 addr11該指令執(zhí)行時(shí) 先將PC的內(nèi)容加2 這時(shí)PC指向的是AJMP的下一條指令 然后把指令中11位地址碼傳送到PC10 0 而PC15 11保持原內(nèi)容不變 在目標(biāo)地址的11位中 前3位為頁地址 后8位為頁內(nèi)地址 每頁含256個(gè)單元 當(dāng)前PC的高5位 即下條指令的存儲地址的高5位 可以確定32個(gè)2KB段之一 所以 AJMP指令的轉(zhuǎn)移范圍為包含AJMP下條指令在內(nèi)的2KB區(qū)間 3 7 1無條件轉(zhuǎn)移 2020年2月24日星期一 80 2020年2月24日星期一 81 二 長跳轉(zhuǎn)LJMPaddr16 PC PC 3 PC addr16第一字節(jié)為操作碼 該指令執(zhí)行時(shí) 將指令的第二 三字節(jié)地址碼分別裝入指令計(jì)數(shù)器PC的高8位和低8位中 程序無條件地轉(zhuǎn)移到指定的目標(biāo)地址去執(zhí)行 LJMP提供的是16位地址 因此程序可以轉(zhuǎn)向64KB的程序存儲器地址空間的任何單元 例若標(biāo)號 NEWADD 表示轉(zhuǎn)移目標(biāo)地址1234H 執(zhí)行指令LJMPNEWADD時(shí) 兩字節(jié)的目標(biāo)地址將裝入PC中 使程序轉(zhuǎn)向目標(biāo)地址1234H處運(yùn)行 2020年2月24日星期一 82 三 相對轉(zhuǎn)移SJMPrel PC PC 2 PC PC rel第一字節(jié)為操作碼 第二字節(jié)為相對偏移量rel rel是一個(gè)帶符號的偏移字節(jié)數(shù) 2的補(bǔ)碼 取值范圍為 127 128 負(fù)數(shù)表示反向轉(zhuǎn)移 正數(shù)表示正向轉(zhuǎn)移 需要指出的是 用匯編語言編程時(shí) 指令中的相對地址往往用想轉(zhuǎn)移去的地址標(biāo)號 符號地址 表示 匯編程序在匯編過程中自動(dòng)計(jì)算偏移地址 并填入指令代碼中 在手工匯編時(shí) 可用轉(zhuǎn)移目標(biāo)地址減轉(zhuǎn)移指令所在的源地址 再減轉(zhuǎn)移指令字節(jié)數(shù)2得到偏移字節(jié)數(shù)rel 例若標(biāo)號 NEWADD 表示轉(zhuǎn)移目標(biāo)地址0123H PC的當(dāng)前值為0100H 執(zhí)行指令SJMPNEWADD后 程序?qū)⑥D(zhuǎn)向0123H處執(zhí)行 此時(shí)rel 0123H 0100 2 21H 2020年2月24日星期一 83 四 散轉(zhuǎn)移JMP A DPTR PC PC 1 PC A DPTR 該指令具有散轉(zhuǎn)功能 可以代替許多判別跳轉(zhuǎn)指令 其轉(zhuǎn)移地址由數(shù)據(jù)指針DPTR的16位數(shù)和累加器A的8位數(shù)進(jìn)行無符號數(shù)相加形成 并直接裝入PC 該指令執(zhí)行時(shí)對標(biāo)志位無影響 例已知累加器A中存放有待處理命令編號0 3 程序存儲器存放有起始地址為PMTB的3字節(jié)長轉(zhuǎn)移指令表 編寫程序使機(jī)器按照累加器A中的命令編號轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序 PM MOVR1 ARLAADDA R1MOVDPTR PMTBJMP A DPTRPMTB LJMPPM0LJMPPM1LJMPPM2LJMPPM3 2020年2月24日星期一 84 3 7 2條件轉(zhuǎn)移 一 累加器判0轉(zhuǎn)移 指令的功能是對累加器A的內(nèi)容為0和不為0進(jìn)行檢測并轉(zhuǎn)移 當(dāng)不滿足各自的條件時(shí) 程序繼續(xù)往下執(zhí)行 當(dāng)各自的條件滿足時(shí) 程序轉(zhuǎn)向指定的目標(biāo)地址 目標(biāo)地址的計(jì)算與SJMP指令情況相同 指令執(zhí)行時(shí)對標(biāo)志位無影響 例若累加器A原始內(nèi)容為00H 則 JNZL1 由于A的內(nèi)容為00H 所以程序往下執(zhí)行INCA JNZL2 由于A的內(nèi)容已不為0 所以程序轉(zhuǎn)向L2處執(zhí)行 2020年2月24日星期一 85 二 比較不相等轉(zhuǎn)移 這組指令的功能是對指定的目的字節(jié)和源字節(jié)進(jìn)行比較 若它們的值不相等則轉(zhuǎn)移 轉(zhuǎn)移的目標(biāo)地址為當(dāng)前的PC值加3后 再加指令的第三字節(jié)偏移量rel 若目的字節(jié)的內(nèi)容大于源字節(jié)的內(nèi)容 則進(jìn)位標(biāo)志清0 若目的字節(jié)的內(nèi)容小于源字節(jié)的內(nèi)容 則進(jìn)位標(biāo)志置1 若目的字節(jié)的內(nèi)容等于源字節(jié)的內(nèi)容 程序?qū)⒗^續(xù)往下執(zhí)行 2020年2月24日星期一 86 三 減1不為0轉(zhuǎn)移 通常程序員把內(nèi)部RAM單元用作程序循環(huán)計(jì)數(shù)器 這組指令每執(zhí)行一次 便將目的操作數(shù)的循環(huán)控制單元的內(nèi)容減1 并判其是否為0 若不為0 則轉(zhuǎn)移到目標(biāo)地址繼續(xù)循環(huán) 若為0 則結(jié)束循環(huán) 程序往下執(zhí)行 2020年2月24日星期一 87 例 有一段程序如下 MOV23H 0AHCLRALOOPX ADDA 23HDJNZ23H LOOPXSJMP 該程序執(zhí)行后 A 10 9 8 7 6 5 4 3 2 1 37H 2020年2月24日星期一 88 3 7 3調(diào)用與轉(zhuǎn)移 這兩條指令可以實(shí)現(xiàn)子程序的短調(diào)用和長調(diào)用 目標(biāo)地址的形成方式與AJMP和LJMP相似 這兩條指令的執(zhí)行不影響任何標(biāo)志 一 調(diào)用 2020年2月24日星期一 89 指令執(zhí)行時(shí) 首先獲得下一條指令的地址 并把它壓入堆棧 先低字節(jié) 后高字節(jié) 后 將相應(yīng)子程序的首地址賦給PC 轉(zhuǎn)向執(zhí)行子程序 ACALL指令執(zhí)行時(shí) 被調(diào)用的子程序的首址必須設(shè)在包含當(dāng)前指令 即調(diào)用指令的下一條指令 的第一個(gè)字節(jié)在內(nèi)的2K字節(jié)范圍內(nèi)的程序存儲器中 LCALL指令執(zhí)行時(shí) 被調(diào)用的子程序的首址可以設(shè)在64K字節(jié)范圍內(nèi)的程序存儲器空間的任何位置 例若 SP 07H 標(biāo)號 XADD 表示的實(shí)際地址為0345H PC的當(dāng)前值為0123H 執(zhí)行指令A(yù)CALLXADD后 PC 2 0125H 其低8位的25H壓入堆棧的08H單元 其高8位的01H壓入堆棧的09H單元 PC 0345H 程序轉(zhuǎn)向目標(biāo)地址0345H處執(zhí)行 2020年2月24日星期一 90 RET指令的功能是從堆棧中彈出由調(diào)用指令壓入堆棧保護(hù)的斷點(diǎn)地址 并送入指令計(jì)數(shù)器PC 從而結(jié)束子程序的執(zhí)行 程序返回到斷點(diǎn)處繼續(xù)執(zhí)行 RETI指令是專用于中斷服務(wù)程序返回的指令 除正確返回中斷斷點(diǎn)處執(zhí)行主程序以外 并有清除內(nèi)部相應(yīng)的中斷狀態(tài)寄存器 以保證正確的中斷邏輯 的功能 二 返回 2020年2月24日星期一 91 3 7 4空操作 NOP PC PC 1這條指令不產(chǎn)生任何控制操作 只是將程序計(jì)數(shù)器PC的內(nèi)容加1 該指令在執(zhí)行時(shí)間上要消耗1個(gè)機(jī)器周期 在存儲空間上可以占用一個(gè)字節(jié) 因此 常用來實(shí)現(xiàn)較短時(shí)間的延時(shí)- 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 C51 指令系統(tǒng)
鏈接地址:http://m.jqnhouse.com/p-6381421.html