MCS-51單片機(jī)指令系統(tǒng).ppt
《MCS-51單片機(jī)指令系統(tǒng).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《MCS-51單片機(jī)指令系統(tǒng).ppt(93頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
第3章單片機(jī)的指令系統(tǒng) 本章學(xué)習(xí)指令是控制計(jì)算機(jī)進(jìn)行各種運(yùn)算和操作的命令 一臺(tái)計(jì)算機(jī)所能執(zhí)行的全部指令的集合稱為指令系統(tǒng) 一般來說 一臺(tái)計(jì)算機(jī)的指令越豐富 尋址方式越多 指令的執(zhí)行速度越快 則它的總體功能也就越強(qiáng) 不同種類的單片機(jī)指令系統(tǒng)一般是不同的 本章將以80C51為例 詳細(xì)介紹MCS 51單片機(jī)的指令系統(tǒng)的尋址方式 指令的格式及功能 3 1匯編指令與格式3 1 1指令格式和常用符號(hào) 1 指令格式 1 匯編語言指令格式 標(biāo)號(hào) 操作碼 第一操作數(shù) 第二操作數(shù) 第三操作數(shù) 注釋 其中方括號(hào) 括起來的部分為可選項(xiàng) 例如 AM1 MOVA 78H 向A傳輸立即數(shù)78H 標(biāo)號(hào)標(biāo)號(hào)是指令的符號(hào)地址 程序匯編時(shí) 匯編程序?qū)⒅噶钍椎刂?即指令第一個(gè)字節(jié)所存單元的地址 賦值給標(biāo)號(hào) 有了標(biāo)號(hào) 程序中的其他語句操作就能尋找到該語句 標(biāo)號(hào)由1 6個(gè)英文字母或數(shù)字組成 且第一個(gè)必須為英文字母 本匯編語言中已經(jīng)有確切定義的符號(hào)不能作為標(biāo)號(hào) 如指令助記符 偽指令 寄存器名 條件標(biāo)志等 同一標(biāo)號(hào)在一個(gè)程序中只能定義一次 標(biāo)號(hào)后面必須跟以冒號(hào) 操作碼用來規(guī)定指令進(jìn)行何種操作 是指令中不能空缺的部分 一般采用具有相關(guān)含義的英語單詞或縮寫表示 操作數(shù)表示參與指令操作的數(shù)或數(shù)所在的地址 在一條指令中操作數(shù)的個(gè)數(shù)可以是一個(gè) 二個(gè)或三個(gè) 也可以沒有操作數(shù) 操作碼與操作數(shù)之間以空格分隔 操作數(shù)與操作數(shù)之間用逗號(hào) 分隔 指令中有兩個(gè)操作數(shù)時(shí) 一般將前面的操作數(shù)稱為目的操作數(shù) 后面的操作數(shù)稱為源操作數(shù) 格式為 操作碼目的操作數(shù) 源操作數(shù) 注釋注釋是為了便于閱讀程序 對(duì)語句所作的解釋說明 不產(chǎn)生目標(biāo)代碼 注釋必須用分號(hào) 開頭 當(dāng)注釋內(nèi)容一行寫不完時(shí) 可以換行繼續(xù)寫 但是新的一行必須同樣以 號(hào)開頭 2 機(jī)器碼指令格式機(jī)器碼指令也包括操作碼和操作數(shù)兩個(gè)基本部分 在MCS 51單片機(jī)指令系統(tǒng)中 指令根據(jù)其機(jī)器碼的長度分為單字節(jié) 雙字節(jié)和三字節(jié)三種指令 單字節(jié)指令單字節(jié)指令只有一個(gè)字節(jié)的操作碼 無操作數(shù) 在程序存儲(chǔ)器中占一個(gè)存儲(chǔ)單元 例如指令 RET機(jī)器碼為 00100010 十六進(jìn)制代碼為 22H 例如指令 MOVA R0其機(jī)器碼為 11101000 十六進(jìn)制代碼為 E8H 雙字節(jié)指令雙字節(jié)指令含有兩個(gè)字節(jié) 第一個(gè)字節(jié)為操作碼 第二個(gè)字節(jié)為操作數(shù) 在程序存儲(chǔ)器中要占兩個(gè)存儲(chǔ)單元 例如指令 MOVA 55H機(jī)器碼為 0111010001010101B 十六進(jìn)制代碼為 7455H 其中74H為操作碼 55H為操作數(shù) 累加器A的信息隱含在了操作碼中 三字節(jié)指令這類指令中 第一個(gè)字節(jié)為操作碼 第二和第三字節(jié)均為操作數(shù) 在程序存儲(chǔ)器中要占3個(gè)存儲(chǔ)單元 例如指令 MOV20H 79H機(jī)器碼為 011101010010000001111001B 十六進(jìn)制代碼為 752079H 其中75H為操作碼 20H為操作數(shù)1 79H為操作數(shù)2 2 指令系統(tǒng)中有關(guān)符號(hào)說明在MCS 51指令系統(tǒng)中 描述指令格式時(shí)要用到一些符號(hào) 這些符號(hào)的約定含義是 Rn 當(dāng)前工作寄存器區(qū)中的工作寄存器R0 R7 n 0 1 2 7 Ri 當(dāng)前工作寄存器區(qū)中的工作寄存器R0和R1 i 0或1 Direct 8位直接字節(jié)地址 既可以是內(nèi)部RAM的低128個(gè)單元的地址 也可以是特殊功能寄存器的單元地址 或寄存器符號(hào) data 8位常數(shù) 也稱立即數(shù) 為立即數(shù)前綴符號(hào) data16 16位立即數(shù) addr16 16位目的地址 用于LCALL和LJMP指令中 Addrll 11位目的地址 用于ACALL和AJMP指令中 rel 相對(duì)偏移量 用8位帶符號(hào)數(shù)的補(bǔ)碼表示 在相對(duì)轉(zhuǎn)移指令中作地址偏移量 其對(duì)應(yīng)的十進(jìn)制值范圍為 128 127 Bit 位地址 位操作指令中操作數(shù)的前綴 表示將該操作數(shù)的內(nèi)容取反 X 某寄存器或某單元的內(nèi)容 X 表示以X中的內(nèi)容為地址的單元中的內(nèi)容 數(shù)據(jù)傳送的方向 當(dāng)前指令的起始存放地址 3 1 2偽指令偽指令由程序設(shè)計(jì)人員在源程序中寫出 是對(duì)匯編程序進(jìn)行匯編是下達(dá)的指示 例如 指定程序存放的地址 定義符號(hào) 指定暫存數(shù)據(jù)的存儲(chǔ)區(qū)等 偽指令并不生成目標(biāo)代碼 僅僅在匯編過程中起作用 故又稱他為匯編命令或匯編程序控制命令 不同的單片機(jī)開發(fā)系統(tǒng) 其匯編程序的偽指令并不完全相同 下面介紹一些常用的偽指令 ORG 指定程序或數(shù)據(jù)起點(diǎn) 指令格式 ORGnn其中nn是16位二進(jìn)制數(shù)或十進(jìn)制數(shù)表示的地址值 指令功能 指明隨后語句從nn單元開始存放 匯編時(shí) 第一條指令或數(shù)據(jù)首字節(jié)存入nn單元 以后程序順序往下存放 此語句總是出現(xiàn)在每段源程序的前面 當(dāng)程序中有多條ORG指令時(shí) 要求各條ORG指令的操作數(shù) 16位地址 由小到大順序安排 空間不允許重疊 ORG0000HLJMPMAIN 上電轉(zhuǎn)向主程序ORG0023H 串行口中斷入口地址LJMPSERVE1 轉(zhuǎn)中斷服務(wù)程序ORG2000H 主程序MAIN MOVTMOD 20H 設(shè)T1作方式2MOVTH1 0F3H 賦計(jì)數(shù)初值MOVTL1 0F3HSETBTR1 啟動(dòng)T1 2 END 匯編結(jié)束 指令格式 END或END標(biāo)號(hào)指令功能 源程序的結(jié)束標(biāo)志 表明程序結(jié)束 匯編程序?qū)υ撝噶詈竺娴膬?nèi)容將不再處理 如果源程序是一段子程序 END后不寫標(biāo)號(hào) 如果是主程序 則必須寫標(biāo)號(hào) 所寫標(biāo)號(hào)是該主程序第一條指令的符號(hào)地址 一個(gè)程序中要有而且只能有一條END指令 3 EQU 賦值 指令格式 字符名稱EQU賦值項(xiàng)指令功能 用于給字符名稱賦予一個(gè)特定值 賦值以后 其值在整個(gè)程序中有效 同一字符名稱只能賦值一次 其中 賦值項(xiàng)可以是常數(shù) 地址或標(biāo)號(hào) 其值可為8位或16位二進(jìn)制數(shù) 賦值以后的字符名稱既可以作地址使用也可以作立即數(shù)使用 例如 AAEQUR1A10EQU10HORG0500HMOVR0 A10 R0 10H MOVA AA A R1 4 DB 定義字節(jié) 指令格式 標(biāo)號(hào) DB項(xiàng)或項(xiàng)表指令功能 用于定義字節(jié)的內(nèi)容 項(xiàng)或項(xiàng)表指所定義的一個(gè)字節(jié)或用逗號(hào)分開的字節(jié)串 匯編程序?qū)袲B指令中項(xiàng)或項(xiàng)表所指字節(jié)的內(nèi)容 數(shù)據(jù)或ASCII碼 依次存人從標(biāo)號(hào)開始的存儲(chǔ)器單元 例如 ORG1000HFIRST DB73 01 01 90 38 00 01 00SECOND DB02 34 00 89 67 45 15 26 又例如 ORG0600HSTART MOVA 0B4H TAB DB45H 73 01011010B 5 A 4H上述程序中 通過DB偽指令實(shí)現(xiàn)將項(xiàng)表中的5個(gè)字節(jié)數(shù)依次存放在以TAB標(biāo)號(hào)為起始地址的各存儲(chǔ)單元中 即TAB單元存入45H TAB 1單元存入49H 即73的十六進(jìn)制數(shù) TAB 2單元存入5AH 即01011010B TAB 3單元存入35H 5的ASCll碼 TAB 4單元存入41H A的ASCll碼 TAB 5單元存入FCH 4H的補(bǔ)碼 DW指令 定義字 指令格式 標(biāo)號(hào) DW項(xiàng)或項(xiàng)表指令功能 用于定義字的內(nèi)容 項(xiàng)或項(xiàng)表指所定義的一個(gè)字 兩個(gè)字節(jié) 或用逗號(hào)分開的字節(jié)串 每個(gè)字低8位先放 高8位后放 低字節(jié)放在低地址 高字節(jié)放在高地址 DS 定義數(shù)據(jù)單元 指令格式 標(biāo)號(hào) DS數(shù)字指令功能 用于保留待存放的一定數(shù)量的存貯單元 定義應(yīng)保留的存貯器單元數(shù) 說明自標(biāo)號(hào)所在的地址起共有指令中數(shù)字指明的存貯單元數(shù)保留可供存入數(shù)據(jù) 例如 ORG1800HDATE DS05H上面DS指令表示 從1800H地址開始 保留5個(gè)連續(xù)的地址單元作為備用 注意 對(duì)MCS 51單片機(jī)來說 DB DW DS偽指令只能對(duì)程序存儲(chǔ)器使用 不能對(duì)數(shù)據(jù)存儲(chǔ)器使用 BIT 定義位 指令格式 標(biāo)號(hào)BIT項(xiàng)指令功能 用于定義某特定位的標(biāo)號(hào) 項(xiàng)指的是所定義的位 經(jīng)定義后 便可用指令中隊(duì)左面的標(biāo)號(hào)來代替BIT面項(xiàng)所指出的位 例如 FLGBITF0經(jīng)BIT偽指令定義后 可以在指令中用FLG來代替位地址F0 這就是直接尋址位的第四種表示方式 3 2尋址方式計(jì)算機(jī)絕大多數(shù)指令執(zhí)行時(shí)都需要使用操作數(shù) 因此 指令中就需要給出這些操作數(shù)或者給出尋找操作數(shù)的地址 指令中給出操作數(shù)的地址的方式 叫做尋址方式 根據(jù)指令操作的需要 計(jì)算機(jī)總是提供多種尋址方式 尋址方式越多 計(jì)算機(jī)的尋址能力就越強(qiáng) 單片機(jī)的功能也就越強(qiáng) MCS 5l單片機(jī)共有七種尋址方式 下面分別介紹 1 立即尋址指令中直接給出參與操作的常數(shù) 稱為立即數(shù) 這種尋址方式稱為立即尋址 例3 1 MOVA 60H機(jī)器碼為 74H60H 例3 2 MOVDPTR 1808H機(jī)器碼是 90H18H08H 2 直接尋址指令中直接給出操作數(shù)所在存儲(chǔ)單元的地址 這種尋址方式稱為直接尋址 1 內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū) 00H 7FH 例3 3 MOVA 40H機(jī)器碼是 E5H40H 2 特殊功能寄存器區(qū) 80H FFH 特殊功能寄存器SFR只能用直接尋址方式訪問 當(dāng)直接尋址某個(gè)SFR時(shí) 直接地址可以用它的單元地址 也可以使用它的寄存器符號(hào) 以上兩種表示方式 對(duì)應(yīng)的機(jī)器碼是唯一的 使用后者可以增強(qiáng)程序的可讀性 例3 4 MOVA 0F0HMOVA B以上兩條指令功能完全相同 都是將寄存器B的內(nèi)容送到累加器A中 前一條指令中第二個(gè)操作數(shù)采用B寄存器的單元地址表示 后一條指令中是直接用B寄存器的名稱來表示 但匯編后的機(jī)器碼是完全一樣的 兩個(gè)字節(jié) E5HF0H 3 寄存器尋址指令中指定將某個(gè)寄存器的內(nèi)容作為操作數(shù) 這種尋址方式稱為寄存器尋址 這類寄存器包括工作寄存器R0 R7 A DPTR等 例3 5 INCR2機(jī)器碼是 0AH 4 寄存器間接尋址指令中指定將某一寄存器的內(nèi)容作為操作數(shù)的地址 這種尋址方式稱為寄存器間接尋址 特別要注意的是 存放在寄存器中的內(nèi)容不是操作數(shù) 而是操作數(shù)所在的存儲(chǔ)單元的地址 利用寄存器間接尋址可訪問片內(nèi)RAM和片外RAM單元中的內(nèi)容 訪問片內(nèi)RAM中的數(shù)據(jù)時(shí) 只能使用寄存器R0 R1間接尋址 而訪問片外RAM中的數(shù)據(jù)時(shí) 可使用R0 R1或DPTR間接尋址 此時(shí) 這些寄存器被用作地址指針 前面要加前綴符 規(guī)定用MOV指令訪問片內(nèi)RAM 用MOVX指令訪問片外RAM單元 例3 6 MOVA R0 A R0 機(jī)器碼為 E6H 5 變址尋址以16位寄存器 PC或DPTR 的內(nèi)容作為基址 以累加器A的內(nèi)容作為偏移量 將兩者進(jìn)行相加得到的和作為操作數(shù)地址 這種尋址方式稱為變址尋址 變址尋址只能對(duì)程序存儲(chǔ)器進(jìn)行尋址 它可以分為兩類 1 以PC的當(dāng)前值為基址例如指令 MOVCA A PC PC PC 1 A A PC 單字節(jié)指令 源操作數(shù)為變址尋址 PC的當(dāng)前值是從程序存儲(chǔ)器中取出該條指令后的PC值 它等于該條指令首字節(jié)地址加指令的字節(jié)數(shù) 上述指令的功能是 先使PC加1 然后與累加器的內(nèi)容相加 形成操作數(shù)的地址 2 以DPTR的內(nèi)容為基址例如指令 MOVCA A DPTR A A DPTR 下面這段程序是將程序存儲(chǔ)器ROM中1065H單元的內(nèi)容讀入累加器A中 MOVDPTR 1060H DPTR 1060HMOVA 05H A 05HMOVCA A DPTR A 1065H 6 相對(duì)尋址相對(duì)尋址方式主要用于轉(zhuǎn)移指令 它是把指令中給出的相對(duì)地址偏移量rel與PC當(dāng)前值相加 得到程序轉(zhuǎn)移的目標(biāo)地址 即 目標(biāo)地址 PC當(dāng)前值 relrel是一個(gè)帶符號(hào)的8位二進(jìn)制補(bǔ)碼 其取值范圍為 128 127 指令中含有操作數(shù)rel的轉(zhuǎn)移指令均為相對(duì)轉(zhuǎn)移指令 采用的都是相對(duì)尋址方式例如 在地址1068H處有一條相對(duì)轉(zhuǎn)移指令 1068HSJMP30H PC PC 2 rel指令為雙字節(jié)指令 操作碼為 80H30H PC的當(dāng)前值 1068H 2 106AH 把它與偏移量30H相加 就形成了程序轉(zhuǎn)移的目標(biāo)地址109AH 向后跳轉(zhuǎn) 相對(duì)尋址方式只適合對(duì)程序存儲(chǔ)器的訪問 7 位尋址指令中直接給出位操作數(shù)的地址 這種尋址方式稱為位尋址 例如指令 MOVC 37H CY 37H 3 3指令類型MCS 51單片機(jī)指令系統(tǒng)共有111條指令 這些指令可按不同方法進(jìn)行分類 1 按字節(jié)數(shù)分單字節(jié)指令 49條 雙字節(jié)指令 46條 三字節(jié)指令 16條 2 按指令的執(zhí)行時(shí)間分單機(jī)器周期指令 64條 雙機(jī)器周期指令 45條 四機(jī)器周期指令 2條 3 按指令的功能分?jǐn)?shù)據(jù)傳送指令 28條 算術(shù)運(yùn)算指令 24條 邏輯運(yùn)算指令 25條 控制轉(zhuǎn)移指令 17條 位操作指令 17條 3 4數(shù)據(jù)傳送類指令3 4 1 內(nèi)部數(shù)據(jù)傳送指令指令格式 MOV 目的字節(jié) 源字節(jié) 說明 將源字節(jié)指定的源操作數(shù)傳送到目的字節(jié)指定的存儲(chǔ)單元中 而源字節(jié)不變 1 以累加器A為目的地址指令操作機(jī)器碼MOVA Rn A Rn 11101rrrMOVA direct A direct 11100101directMOVA Ri A Ri 1110011iMOVA data A data01110100data這組指令的功能是把源操作數(shù)送入累加器A中 源操作數(shù)的尋址方式分別為寄存器尋址 直接尋址 寄存器間接尋址和立即尋址方式 機(jī)器碼中i的值取決于 Ri的下標(biāo) i 0或1 2 以Rn為目的地址指令操作機(jī)器碼MOVRn A Rn A 11111rrrMOVRn direct Rn direct 10101rrrdirectMOVRn data Rn data01111rrrdata這組指令的功能是把源操作數(shù)送入工作寄存器中 源操作數(shù)的尋址方式分別為寄存器尋址 直接尋址和立即尋址方式 例3 7 設(shè) 32H 10H 執(zhí)行指令 MOVR0 32HMOVA R0執(zhí)行結(jié)果是 R0 32H A 10H 32H 10H 3 以直接地址為目的地址指令操作機(jī)器碼MOVdirect A direct A 11110101directMOVdirect Rn direct Rn 10001rrrdirectMOVdirect Ri direct Ri 1000011idirectMOVdirect1 direct2 direct1 direct2 10000101direct2direct1MOVdirect data direct data01110101directdata這組指令的功能是將源操作數(shù)送入直接地址所指的存儲(chǔ)單元中 源操作數(shù)的尋址方式分別為寄存器尋址 寄存器間接尋址 直接尋址和立即尋址方式 4 以寄存器間接地址為目的地址指令操作機(jī)器碼MOV Ri A Ri A 1111011iMOV Ri direct Ri direct 1010011idirectMOV Ri data Ri data0111011idata這組指令的功能是把源操作數(shù)送入R0或R1指針間接尋址的片內(nèi)RAM單元中 源操作數(shù)的尋址方式分別為寄存器尋址 直接尋址和立即尋址方式 該組指令中目的操作數(shù)是寄存器間接尋址方式 可在片內(nèi)RAM的00H 7FH范圍內(nèi)尋址 寄存器間接尋址是不能對(duì)SFR區(qū)進(jìn)行訪問的 這是對(duì)8051 8031 8751等芯片而言的 對(duì)增強(qiáng)型單片機(jī)芯片如8052 8032和8752等具有與SFR區(qū)地址重疊的高128個(gè)單元 80 FFH 的片內(nèi)RAM 該高128個(gè)單元只能采用寄存器間接尋址方式進(jìn)行讀寫操作 5 以DPTR為目的地址的16位指令指令操作機(jī)器碼MOVDPTR data16 DPTR data1610010000 data 高8位 data 低8位這條指令的功能是把一個(gè)16位立即數(shù)送入DPTR寄存器 立即數(shù)的高8位送DPH 立即數(shù)的低8位送DPL 例3 8 MOVDPTR 2200H DPTR 2200H指令的執(zhí)行結(jié)果是 DPTR 2200H 其中 DPH 22H DPL 00H 例3 9 設(shè) 30H 40H 40H 10H P1 0CAH 試判斷下列程序執(zhí)行后的結(jié)果 MOVR0 30H R0 30HMOVA R0 A 30H A 40HMOVR1 A R1 A R1 40HMOVB R1 B 40H B 10HMOV R1 P1 R1 P1 40H 0CAHMOVP2 P1 P2 P1 P2 0CAH結(jié)果是 A 40H B 10H 40H 0CAH P2 0CAH 3 4 2 片外數(shù)據(jù)傳送指令此類指令實(shí)際上是片外RAM與累加器A之間的傳送指令 片外RAM單元只能采用寄存器間接尋址的方式來訪問 R0 R1或DPTR可作間接尋址的寄存器 1 用DPTR間接尋址的指令指令操作機(jī)器碼MOVXA DPTR A DPTR 11100000MOVX DPTR A DPTR A 11110000使用以上兩條指令時(shí) 先將要訪問的片外RAM單元的地址送入DPTR 然后再用上述指令來實(shí)現(xiàn)數(shù)據(jù)的傳送 例3 10 將片外RAM1000H單元中的內(nèi)容送到2000H單元 MOVDPTR 1000H DPTR 1000HMOVXA DPTR A DPTR MOVDPTR 2000H DPTR 2000HMOVX DPTR A DPTR A 在兩個(gè)片外RAM單元之間是不能直接進(jìn)行數(shù)據(jù)的傳送的 必須經(jīng)過片內(nèi)的累加器A來間接地傳送 由于DPTR是16位的地址指針 因此可尋址64KB的外部RAM 2 用R0和R1間接尋址的指令指令操作機(jī)器碼MOVXA Ri A Ri 1110001i A P2Ri MOVX Ri A Ri A 1111001i P2Ri A 使用以上指令時(shí) 要先將外部RAM的單元地址送入Ri R0或R1 由于Ri只能存入8位地址 因此用它對(duì)外部RAM間接尋址只能限于256個(gè)單元 由P2口輸出外部RAM的高8位地址 也稱頁地址 而由Ri提供低8位地址 進(jìn)行頁內(nèi)尋址 每256個(gè)單元為1頁 則可共同尋址64KB范圍 例3 11 將累加器A的內(nèi)容送外部RAM的2060H單元中 MOVP2 20H P2 20H 得到頁地址MOVR0 60H R0 60H 得到頁內(nèi)地址MOVX R0 A 2060H A 3 4 3訪問程序存儲(chǔ)器的傳送指令此類指令只有兩條 格式如下 指令操作機(jī)器碼MOVCA A PC PC PC 110000011 A A PC MOVCA A DPTR A A DPTR 10010011其功能是把程序存儲(chǔ)器中源操作數(shù)的內(nèi)容送入累加器A 程序存儲(chǔ)器中除了存放程序之外 還會(huì)放一些表格數(shù)據(jù) 這組指令用于到程序存儲(chǔ)器中查表格數(shù)據(jù) 并將它送入累加器A 所以也稱它們?yōu)椴楸碇噶?例3 12 用數(shù)據(jù)傳送指令實(shí)現(xiàn)下列要求的數(shù)據(jù)傳送 將片內(nèi)RAM60H單元內(nèi)容送外部RAM1030H單元 將ROM1000H單元內(nèi)容送內(nèi)部RAM70H單元 程序 MOVP2 10HMOVR0 30HMOVA 60HMOVX R0 A程序 MOVA 00HMOVDPTR 1000HMOVCA A DPTRMOV70H A 3 4 4 數(shù)據(jù)交換指令數(shù)據(jù)交換是在內(nèi)部RAM單元與累加器A之間進(jìn)行 有字節(jié)和半字節(jié)交換兩種 1 字節(jié)交換指令指令操作機(jī)器碼XCHA Rn A Rn 11001rrrXCHA direct A direct 11000101directXCHA Ri A Ri 1100011i這組指令的功能是將累加器A的內(nèi)容與源操作數(shù)相互交換 源操作數(shù)的尋址方式分別為寄存器尋址 直接尋址和寄存器間接尋址方式 2 半字節(jié)交換指令指令操作機(jī)器碼XCHDA Ri A 3 0 Ri 3 01101011i指令的功能是將累加器A的低4位與Ri間接尋址單元內(nèi)容的低4位相互交換 各自的高4位維持不變 3 4 5 堆棧操作指令在MCS 51單片機(jī)的片內(nèi)RAM中 可設(shè)置一個(gè)后進(jìn)先出的堆棧區(qū) 主要用于保護(hù)和恢復(fù)CPU的工作現(xiàn)場 也可實(shí)現(xiàn)內(nèi)部RAM單元之間的數(shù)據(jù)傳送和交換 堆棧操作時(shí) 堆棧指針SP始終指向棧頂位置 一般在初始化時(shí)應(yīng)對(duì)SP進(jìn)行設(shè)定 通常將堆棧設(shè)在內(nèi)部RAM的30H 7FH范圍內(nèi) 堆棧操作有進(jìn)棧和出棧兩種 1 進(jìn)棧指令指令操作機(jī)器碼PUSHdirect SP SP 111000000direct SP direct 是一條雙字節(jié)指令 操作數(shù)只能采用直接尋址的方式訪問 指令的功能是先將堆棧指針SP的內(nèi)容加1 指針上移一個(gè)單元 然后將直接尋址的單元內(nèi)容送到SP指針?biāo)傅亩褩卧?棧頂 例3 13 設(shè) SP 09H DPTR 0123H 試分析下列指令的執(zhí)行結(jié)果 PUSHDPL行第一條指令 SP 1 0AH SP DPL 23H 0AH PUSHDPH執(zhí)行第二條指令 SP 1 0BH SP DPH 01H 0BH 執(zhí)行結(jié)果是 0AH 23H 0BH 01H SP 0BH 2 出棧指令指令操作機(jī)器碼POPdirect direct SP 11010000direct SP SP 1指令的功能是將堆棧指針SP所指的單元 棧頂 內(nèi)容彈出 并送入直接尋址的 direct 單元中 然后SP的內(nèi)容減1 指針下移一個(gè)單元 例3 14 設(shè) SP 32H 31H 23H 32H 01H 試分析下列指令的執(zhí)行結(jié)果 POPDPH SP 32H 01H DPH SP 1 32H 1 31H SPPOPDPL SP 31H 23H DPL SP 1 31H 1 30H SP執(zhí)行結(jié)果為 DPTR 0123H SP 30H 3 5算術(shù)運(yùn)算類指令3 5 1加法指令1 不帶進(jìn)位的加法指令指令操作機(jī)器碼ADDA Rn A A Rn 00101rrrADDA direct A A direct 00100101directADDA Ri A A Ri 0010011iADDA data A A data00100100data這組加法指令的功能是將源操作數(shù)和累加器A中的操作數(shù)相加 其結(jié)果存放到A中 源操作數(shù)分別為寄存器尋址 直接尋址 寄存器間接尋址和立即尋址 例3 15 設(shè)有兩個(gè)無符號(hào)數(shù)放在A和R2中 設(shè) A 0C6H 198 R2 68H 104 執(zhí)行指令 ADDA R2試分析運(yùn)算結(jié)果及對(duì)標(biāo)志位的影響 解 寫成豎式 A 11000110198 R2 01101000 104 A 100101110302結(jié)果是 A 2EH CY 1 AC 0 OV 0 兩個(gè)無符號(hào)數(shù)相加 要根據(jù)CY來判斷 由CY 1可知本次運(yùn)算結(jié)果發(fā)生了溢出 結(jié)果超出了255 結(jié)果應(yīng)該是包括CY在內(nèi)的9位二進(jìn)制數(shù) 即302 2 帶進(jìn)位加法指令A(yù)DDC指令操作機(jī)器碼ADDCA Rn A A Rn CY 00111rrrADDCA direct A A direct CY 00110101directADDCA Ri A A Ri CY 0011011iADDCA data A A data CY 00110100data這組指令的功能是將累加器A的內(nèi)容 指令中的源操作數(shù) 和CY的值相加 并把相加結(jié)果存放到A中 ADDC指令對(duì)PSW標(biāo)志位的影響與ADD指令相同 這組指令常用于多字節(jié)加法運(yùn)算中的高字節(jié)相加 考慮到了低字節(jié)相加時(shí)產(chǎn)生向高字節(jié)的進(jìn)位情況 3 加1指令指令操作機(jī)器碼INCA A A 100000100INCRn Rn Rn 100001rrrINCdirect direct direct 100000101directINC Ri Ri Ri 10000011iINCDPTR DPTR DPTR 110100011這組指令的功能是使源地址所指的RAM單元中的內(nèi)容加1 操作數(shù)可采用寄存器尋址 直接尋址 寄存器間接尋址方式 除INCA指令對(duì)奇偶標(biāo)志位 P 有影響外 其余指令執(zhí)行時(shí)均不會(huì)對(duì)PSW的任何標(biāo)志位產(chǎn)生影響 例3 16 設(shè)有兩個(gè)16位無符號(hào)數(shù) 被加數(shù)存放在內(nèi)部RAM的30H 低位字節(jié) 和31H 高位字節(jié) 中 加數(shù)存放在40H 低位字節(jié) 和41H 高位字節(jié) 中 試寫出求兩數(shù)之和 并把結(jié)果存放在30H和31H單元中的程序 解 參考程序?yàn)镸OVR0 30H 地址指針R0賦值MOVR1 40H 地址指針R1賦值MOVA R0 被加數(shù)的低8位送AADDA R1 被加數(shù)與加數(shù)的低8位相加 和送A 并影響CY標(biāo)志MOV R0 A 和的低8位存30H單元INCR0 修改地址指針R0INCR1 修改地址指針R1MOVA R0 被加數(shù)的高8位送AADDCA R1 被加數(shù)和加數(shù)的高8位與Cy相加 和送AMOV R0 A 和的高8位存31H單元 3 5 2減法指令帶借位減法指令指令操作機(jī)器碼SUBBA Rn A A Rn Cy 10011rrrSUBBA direct A A direct Cy 10010101directSUBBA Ri A A Ri Cy 1001011iSUBBA data A A data Cy 10010100data該組指令的功能是從累加器A減去源操作數(shù)及標(biāo)志位CY 其結(jié)果再送累加器A 即被減數(shù)在累加器A中 減數(shù)分別采用寄存器尋址 直接尋址 寄存器間接尋址和立即尋址方式 還有一個(gè)減數(shù)為PSW中的CY位 CY位在減法運(yùn)算中是作借位標(biāo)志 例3 17 設(shè) A 98H R3 6AH CY 1 執(zhí)行指令 SUBBA R3分析執(zhí)行結(jié)果及對(duì)標(biāo)志位的影響解 A 1001100098H R3 011010106AHCY 1 1 A 001011012DH結(jié)果是 A 2DH CY 0 AC 1 OV 1若看成無符號(hào)數(shù)相減 因CY 0 表示無借位 152 106 1 45 若看成帶符號(hào)數(shù)相減 因OV 1 表示溢出 結(jié)果出錯(cuò) 104 106 1 45 2 減1指令指令操作機(jī)器碼DECA A A 100010100DECRn Rn Rn 100011rrrDECdirect direct direct 100010101directDEC Ri Ri Ri 10001011i這組指令的功能是使源地址所指的RAM單元中的內(nèi)容減1 操作數(shù)可采用寄存器尋址 直接尋址和寄存器間接尋址方式 除DECA指令影響P標(biāo)志位外 其余減1指令均不影響任何標(biāo)志 3 5 3十進(jìn)制調(diào)整指令指令機(jī)器碼DAA11010100指令用于實(shí)現(xiàn)BCD碼的加法運(yùn)算 其功能是將累加器A中按二進(jìn)制相加后的結(jié)果調(diào)整成BCD碼相加的結(jié)果 例3 18 設(shè) A 01110101 BCD 75 R3 01101001 BCD 69 CY 0 執(zhí)行 ADDA R3DAA執(zhí)行過程為 A 01110101 R3 01101001 A 11011110 得到二進(jìn)制加法的結(jié)果 110 低4位 9 加6修正11100100 110 高4位 9 加6修正101000100 得到BCD碼加法的正確結(jié)果進(jìn)位執(zhí)行后 A 01000100 BCD 44 CY 1 運(yùn)算結(jié)果為144 3 5 4乘法指令指令操作機(jī)器碼MULAB BA A B 10100100指令的功能是把累加器A和寄存器B中兩個(gè)8位無符號(hào)整數(shù)相乘 并把乘積的高8位存于寄存器B中 低8位存于累加器A中 乘法運(yùn)算指令執(zhí)行時(shí)會(huì)對(duì)標(biāo)志位產(chǎn)生影響 CY標(biāo)志總是被清0 即CY 0 OV標(biāo)志則反映乘積的位數(shù) 若OV 1 表示乘積為16位數(shù) 若OV 0 表示乘積為8位數(shù) 例3 19 設(shè) A 64H 100 B 3CH 60 執(zhí)行指令 MULAB結(jié)果是 A B 1770H 6000 A 70H B 17H CY 0 OV 1 3 5 5除法指令指令操作機(jī)器碼DIVAB A商 B余 A B 10000100指令的功能是把累加器A和寄存器B中的兩個(gè)8位無符號(hào)整數(shù)相除 所得商的整數(shù)部分存于累加器A中 余數(shù)存于B中 除法指令執(zhí)行過程對(duì)標(biāo)志位的影響 CY位總是被清0 OV標(biāo)志位的狀態(tài)反映寄存器B中的除數(shù)情況 若除數(shù)為0 則OV 1 表示本次運(yùn)算無意義 否則 OV 0 例3 20 設(shè) A 0F0H 240 B 20H 32 執(zhí)行指令 DIVAB結(jié)果是 A 07H 商7 B 10H 余數(shù)16 Cy 0 OV 0 3 6邏輯運(yùn)算類指令3 6 1累加器A的邏輯操作指令1 累加器A清0CLRA A 00H111001002 累加器A取反CPLA A 111101003 累加器A循環(huán)左移RLA00100011 11001010變成10010101考慮實(shí)驗(yàn)一 A FEH 11111110B變成11111101B 例3 21 執(zhí)行下列指令后 A中的內(nèi)容如何變化 MOVA 11H A 11H 17 RLA A 22H 34 RLA A 44H 68 RLA A 88H 136 RLA A 11H 17 00010001左環(huán)移一次 00100010左環(huán)移兩次 01000100左環(huán)移三次 10001000利用左移指令 可實(shí)現(xiàn)對(duì)A中的無符號(hào)數(shù)乘2的目的 4 累加器A帶進(jìn)位循環(huán)左移RLCA00110011010001101變成1000110105 累加器A循環(huán)右移RRA0000001101000100B 44H 變成00100010B 22H 對(duì)累加器A進(jìn)行的循環(huán)右移 可實(shí)現(xiàn)對(duì)A中無符號(hào)數(shù)的除2運(yùn)算 6 累加器A帶進(jìn)位循環(huán)右移RRCA00010011010001101B變成1010001107 累加器A半字節(jié)交換D7 D4D3 D0SWAPA1100010000101100B變成11000010B功能是將累加器A中內(nèi)容的高4位與低4位互換 3 6 2邏輯與指令A(yù)NLA Rn A A Rn 01011rrrANLA direct A A direct 01010101directANLA Ri A A Ri 0101011iANLA data A A data01010100dataANLdirect A direct direct A 01010010directANLdirect data direct direct data01010011directdata前4條指令均以累加器A為目的操作數(shù) 其功能是將累加器A的內(nèi)容和源操作數(shù)按位進(jìn)行邏輯與操作 結(jié)果送累加器A 源操作數(shù)可采用寄存器尋址 直接尋址 寄存器間接尋址或立即尋址方式 指令執(zhí)行時(shí)將影響奇偶標(biāo)志位P 在程序設(shè)計(jì)中 邏輯與指令主要用于對(duì)目的操作數(shù)中的某些位進(jìn)行屏蔽 清0 方法是 將需屏蔽的位與 0 相與 其余位與 1 相與即可 例3 22 分析下列兩條指令的執(zhí)行結(jié)果 ANL30H 0FHANLA 80H第一條指令執(zhí)行后 將30H單元內(nèi)容的高4位屏蔽 清0 只保留了低4位 可用于將0 9的ASCII碼轉(zhuǎn)換為BCD碼 設(shè) 30H 35H 5的ASCII碼 執(zhí)行指令后變?yōu)?30H 05H 5的BCD碼 第二條指令執(zhí)行后 只保留了最高位 而其余各位均被屏蔽掉 可用于對(duì)累加器A中的帶符號(hào)數(shù)的正負(fù)判斷 若A中為負(fù)數(shù) 則執(zhí)行該指令后 A 00H 若A中為正數(shù) 則結(jié)果為 A 00H 3 6 3邏輯或指令ORLA Rn A A Rn 01001rrrORLA direct A A direct 01000101directORLA Ri A A Ri 0100011iORLA data A A data01000100dataORLdirect A direct direct A 01000010directORLdirect data direct direct data01000011directdata這組指令的功能是對(duì)兩個(gè)操作數(shù)按位進(jìn)行邏輯或操作 源操作數(shù)及目的操作數(shù)的尋址方式和ANL指令類似 前4條指令將影響P標(biāo)志位 邏輯或指令可對(duì)目的操作數(shù)的某些位進(jìn)行置位 方法是 將需置位的位與 1 相或 其余位與 0 相或即可 常用于組合數(shù)據(jù) 例3 23 將工作寄存器R2中數(shù)據(jù)的高4位和R3中的低4位拼成一個(gè)數(shù) 并將該數(shù)存入30H MOVR0 30H R0作地址指針MOVA R2ANLA 0F0H 屏蔽低4位MOVB A 中間結(jié)果存B寄存器MOVA R3ANLA 0FH 屏蔽高4位ORLA B 組合數(shù)據(jù)MOV R0 A 結(jié)果存30H單元 3 6 4邏輯異或指令XRLA Rn A A Rn 01101rrrXRLA direct A A direct 01100101directXRLA Ri A A Ri 0110011iXRLA data A A data01100100dataXRLdirect A direct direct A 01100010directXRLdirect data direct direct data01100011directdata表示當(dāng)兩個(gè)輸入中只有一個(gè)為1時(shí) 輸出為1 否則為0 異或運(yùn)算的邏輯表達(dá)式為 A反B AB反邏輯異或指令可用于對(duì)目的操作數(shù)的某些位取反 而其余位不變 方法是 將要取反的這些位和 1 異或 其余位則和 0 異或即可 例3 24 分析下列程序的執(zhí)行結(jié)果 MOVA 77H A 77HXRLA 0FFH A 77H FFH 88HANLA 0FH A 88H 0FH 08HMOVP1 64H P1 64HANLP1 0F0H P1 64H F0H 60HORLA P1 A 08H 60H 68H01110111B 11111111B 10001000B10001000B 00001111B 00001000B01100100B 11110000B 01100000B00001000BH 01100000B 01101000B 3 7控制轉(zhuǎn)移類指令3 7 1無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令是使程序無條件轉(zhuǎn)移到指定的地址去執(zhí)行 它分為長轉(zhuǎn)移指令 短轉(zhuǎn)移指令 相對(duì)轉(zhuǎn)移指令和間接轉(zhuǎn)移指令4條 該類指令不影響標(biāo)志位 長轉(zhuǎn)移指令LJMPaddr16 PC addr1600000010a15 a8a7 a0例如 LJMP1000H PC 1000H 程序轉(zhuǎn)向1000H地址處執(zhí)行LJMPABD PC ABD 程序轉(zhuǎn)向ABD地址處執(zhí)行在后一條指令中 使用了符號(hào)地址ABD 這在程序中是常見到的 符號(hào)地址是某條指令前的標(biāo)號(hào) 2 短轉(zhuǎn)移指令A(yù)JMPaddr11 PC PC 2a10a9a800001a7 a0 PC10 0 addr11指令的功能是先使程序計(jì)數(shù)器PC值加2 完成取指并指向下一條指令的地址 然后將指令提供的addrll作為轉(zhuǎn)移目的地址的低11位 和PC當(dāng)前值的高5位形成16位的目標(biāo)地址 程序隨即轉(zhuǎn)移到該地址處執(zhí)行 這是一條2字節(jié)指令 addrll可表示的地址是從00000000000 11111111111 范圍為2KB 轉(zhuǎn)移地址的高5位是PC當(dāng)前值中的內(nèi)容 也就是說 轉(zhuǎn)移地址的高5位和PC當(dāng)前值的高5位相同 低11位地址不同 即指令的目標(biāo)地址和PC當(dāng)前值位于同一個(gè)2KB區(qū)域內(nèi) 不符合這個(gè)規(guī)定將不能轉(zhuǎn)移 故絕對(duì)轉(zhuǎn)移指令允許在2KB范圍內(nèi)轉(zhuǎn)移 例3 25 判斷下面指令能否正確執(zhí)行 2056HAJMP2C70H取指后PC 2 2058H 高5位地址為00100 而轉(zhuǎn)移地址2C70H的高5位是00101 兩個(gè)地址不處在同一個(gè)2KB區(qū) 故不能正確轉(zhuǎn)移 2056H 0010000001010110 2058H 0010000001011000 2C70H 00101100 3 相對(duì)轉(zhuǎn)移指令SJMPrel PC PC 2 rel10000000rel這是一條相對(duì)尋址方式的無條件轉(zhuǎn)移指令 字節(jié)數(shù)為2 指令的功能是先使程序計(jì)數(shù)器PC 2 完成取指并指向下一條指令地址 然后把PC當(dāng)前值與地址偏移量rel相加作為目標(biāo)轉(zhuǎn)移地址 即 目標(biāo)地址 PC 2 rel PC 當(dāng)前值 relrel是一個(gè)帶符號(hào)的8位二進(jìn)制數(shù)的補(bǔ)碼 數(shù)值范圍是 128 127 所以SJMP指令的轉(zhuǎn)移范圍是 以PC當(dāng)前值為起點(diǎn) 可向前 號(hào)表示 跳128個(gè)字節(jié) 或向后 號(hào)表示 跳127字節(jié) 例3 26 確定以下指令的轉(zhuǎn)移目標(biāo)地址各為多少 1 2300HSJMP25H 2 2300HSJMPD7H 1 25H 00100101 為正數(shù) 程序?qū)⑾蚝筠D(zhuǎn)移 所以 目標(biāo)地址 PC 2 rel PC 當(dāng)前值 rel 2300H 2 25H 2327H 2 D7H 11010111 是負(fù)數(shù) 程序?qū)⑾蚯稗D(zhuǎn)移 D7H 29H 補(bǔ) 所以 目標(biāo)地址 PC 2 rel 2300H 2 29H 22D9H 例3 27 分析下面指令的功能 HERE SJMP0FEH0FEH為負(fù)數(shù) 11111110 0FEH 2 補(bǔ) 所以目標(biāo)地址 PC 2 rel HERE 2 2 HERE指令的執(zhí)行結(jié)果是轉(zhuǎn)向本條指令自己 程序在原處無限循環(huán) 稱為動(dòng)態(tài)停機(jī)或踏步指令 一般寫成 HERE SJMPHERE或SJMP 4 間接轉(zhuǎn)移指令JMP A DPTR PC A DPTR 01110011指令的功能是將累加器A中8位無符號(hào)數(shù)與DPTR的16位內(nèi)容相加 和作為目標(biāo)地址送入PC 實(shí)現(xiàn)無條件轉(zhuǎn)移 間接轉(zhuǎn)移指令采用變址尋址方式 DPTR稱作基址寄存器 值通常由用戶預(yù)先設(shè)定 累加器A的內(nèi)容作偏移量 在程序運(yùn)行中可以改變 根據(jù)A的不同值 就可轉(zhuǎn)移到不同的地址 實(shí)現(xiàn)多分支轉(zhuǎn)移 又稱散轉(zhuǎn) 3 7 2條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令要求對(duì)某一特定條件進(jìn)行判斷 當(dāng)滿足給定的條件 程序就轉(zhuǎn)移到目標(biāo)地址去執(zhí)行 條件不滿足則順序執(zhí)行下一條指令 可用于實(shí)現(xiàn)分支結(jié)構(gòu)的程序 這類指令都采用相對(duì)尋址方式 若條件滿足 則由PC的當(dāng)前值與相對(duì)偏移量rel相加形成轉(zhuǎn)移的目標(biāo)地址 這與無條件轉(zhuǎn)移中的SJMP指令相類似 其中CJNE指令會(huì)影響標(biāo)志位CY的狀態(tài) 條件轉(zhuǎn)移指令分為三種 累加器A的判零轉(zhuǎn)移 比較轉(zhuǎn)移和循環(huán)轉(zhuǎn)移三類 1 累加器A的判零轉(zhuǎn)移指令判零轉(zhuǎn)移指令有2條 均為2字節(jié)指令 該組指令不影響標(biāo)志位 JZrel 若 A 0則PC PC 2 rel若 A 0則PC PC 2JNZrel 若 A 0則PC PC 2 rel若 A 0則PC PC 2第一條指令的功能是如果累加器A的內(nèi)容為零 則程序轉(zhuǎn)向指定的目標(biāo)地址 否則程序順序執(zhí)行 第二條指令的功能是如果累加器A的內(nèi)容不為零 則程序轉(zhuǎn)向指定的目標(biāo)地址 否則程序順序執(zhí)行 例3 28 將片內(nèi)RAM的40H單元開始的數(shù)據(jù)塊傳送到片外RAM的1000H開始的單元中 當(dāng)遇到傳送的數(shù)據(jù)為零則停止傳送 START MOVR0 40H 片內(nèi)RAM數(shù)據(jù)首址MOVDPTR 1000H 片外RAM數(shù)據(jù)首址LOOP MOVA R0 取數(shù)JZABD 等于零 結(jié)束MOVX DPTR A 不為零 送數(shù)INCR0 地址指針加1INCDPTR 地址指針加1SJMPLOOP 轉(zhuǎn)LOOP 繼續(xù)取數(shù)ABD SJMPABD 踏步 2 比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令共有4條 均為3字節(jié)指令 該組指令會(huì)影響CY標(biāo)志 CJNEA data rel 若 A data 則PC PC 3 rel若 A data 則PC PC 3CJNEA direct rel 若 A direct 則PC PC 3 rel若 A direct 則PC PC 3CJNERn data rel 若 Rn data 則PC PC 3 rel若 Rn data 則PC PC 3CJNE Ri data rel 若 Ri data 則PC PC 3 rel若 Ri data 則PC PC 3該組指令的功能是將前兩個(gè)操作數(shù)進(jìn)行比較 若不相等則程序轉(zhuǎn)移到指定的目標(biāo)地址執(zhí)行 相等則順序執(zhí)行 要注意的是 指令執(zhí)行過程中 對(duì)兩個(gè)操作數(shù)進(jìn)行比較是采用相減運(yùn)算的方法 因此比較結(jié)果會(huì)影響CY標(biāo)志 如前數(shù)小于后數(shù) 則CY 1 相減時(shí)有借位 否則 CY 0 無借位 我們可以進(jìn)一步根據(jù)對(duì)CY值的判斷確定兩個(gè)操作數(shù)的大小 實(shí)現(xiàn)多分支轉(zhuǎn)移 例3 29 某溫度控制系統(tǒng)中 溫度的測量值T存在累加器A 溫度的給定值Tg存在60H單元 要求 T Tg時(shí) 程序返回 符號(hào)地址為FH T Tg時(shí) 程序轉(zhuǎn)向降溫處理程序 符號(hào)地址為JW T Tg時(shí) 程序轉(zhuǎn)向升溫處理程序 符號(hào)地址為SW 試編制程序 相應(yīng)的程序如下 MOV60H TgMOVA TCJNEA 60H L00P T Tg 轉(zhuǎn)向L00PAJMPFH T Tg 轉(zhuǎn)向FHLOOP JCSW TTg 轉(zhuǎn)向JW 3循環(huán)轉(zhuǎn)移指令DJNZRn rel 若 Rn 1 0 則PC PC 2 rel若 Rn 1 0 則PC PC 2DJNZdirect rel 若 direct 1 0 則PC PC 3 rel若 direct 1 0 則PC PC 3其功能是將Rn的內(nèi)容減1后進(jìn)行判斷 若不為零則程序轉(zhuǎn)移到目標(biāo)地址處執(zhí)行 若為零 則程序順序執(zhí)行 兩條指令都不影響標(biāo)志位 例3 30 將片內(nèi)RAM的30H 39H單元置初值00H 09H MOVR0 30H 設(shè)定地址指針MOVR2 0AH 數(shù)據(jù)區(qū)長度設(shè)定MOVA 00H 初值裝入ALOOP MOV R0 A 送數(shù)INCR0 修改地址指針I(yè)NCA 修改待傳送的數(shù)據(jù)DJNZR2 LOOP 未送完 轉(zhuǎn)LOOP地址繼續(xù)送 否則傳送結(jié)束HERE SJMPHERE 踏步 3 7 3子程序調(diào)用和返回指令在程序設(shè)計(jì)過程中 經(jīng)常會(huì)遇到在不同程序或同一程序的不同位置都需要進(jìn)行功能完全相同的操作處理 常將這種需多次使用的操作程序段設(shè)計(jì)為子程序而單獨(dú)編寫 供主程序在需要時(shí)調(diào)用 主程序在需要時(shí)通過調(diào)用指令去調(diào)用子程序 子程序執(zhí)行完后再由返回指令返回到主程序 因此 調(diào)用指令應(yīng)放在主程序中 返回指令應(yīng)放在子程序中 放在最后一條的位置 同一個(gè)子程序可以被多次調(diào)用 子程序還可調(diào)用別的子程序 稱為子程序嵌套 1 調(diào)用指令 1 長調(diào)用指令LCALLaddr16 PC PC 3SP SP 1 SP PC7 0 SP SP 1 SP PC15 8 PC addr16這是一條三字節(jié)的指令 指令的功能是先將PC 3 完成取指操作并指向下一條指令的地址 再把該地址 又稱斷點(diǎn)地址 壓入堆棧保護(hù)起來 然后把a(bǔ)ddr16送入PC 并轉(zhuǎn)入該地址執(zhí)行子程序 2 絕對(duì)調(diào)用指令A(yù)CALLaddr11 PC PC 2SP SP 1 SP PC7 0 SP SP 1 SP PC15 8 PC10 0 addr11這是一條2字節(jié)的指令 指令的功能是先將PC 2 完成取指操作并指向下一條指令的地址 再將該地址 斷點(diǎn)地址 壓入堆棧保護(hù)起來 然后將指令中的addrll送入PC 和PC當(dāng)前值的高5位合并形成16位的子程序入口地址 并轉(zhuǎn)入該地址執(zhí)行子程序 注意 范圍2k 2 返回指令 1 子程序返回指令RET PC15 8 SP SP SP 100100010PC7 0 SP SP SP 1指令的功能是將保存在堆棧中的斷點(diǎn)地址彈出 送給PC 使CPU結(jié)束子程序 返回到斷點(diǎn)地址處繼續(xù)執(zhí)行主程序 該指令應(yīng)放在子程序結(jié)束處 2 中斷返回指令RETI PC15 8 SP SP SP 100110010PC7 0 SP SP SP 1指令的功能與RET相似 也是將保存在堆棧中的斷點(diǎn)地址彈出 送給PC 使CPU返回到斷點(diǎn)地址處繼續(xù)執(zhí)行主程序 不同的是 它不是從子程序返回主程序 而是從中斷服務(wù)程序返回到主程序 所以該指令是中斷服務(wù)程序的結(jié)束指令 圖3 8子程序的調(diào)用和返回示意圖 3 空操作指令NOP PC PC 1空操作指令是單字節(jié)指令 該指令執(zhí)行時(shí)不進(jìn)行任何有效的操作 但需要消耗一個(gè)機(jī)器周期的時(shí)間 所以在程序設(shè)計(jì)中可用于短暫的延時(shí) 例3 31 以下程序段可使P1 0引腳向外輸出周期為10個(gè)機(jī)器周期的方波 START CPLP1 0 1個(gè)機(jī)器周期NOP 1個(gè)機(jī)器周期NOP 1個(gè)機(jī)器周期SJMPSTART 2個(gè)機(jī)器周期 3 8位操作類指令在MCS 51指令系統(tǒng)中共有17條位操作指令 可以實(shí)現(xiàn)位變量的傳送 修改和邏輯運(yùn)算等操作 位操作指令中 bit是位變量的位地址 可使用四種不同的表示方法 下面以CY位為例進(jìn)行說明 位地址 如 D7H 位定義名 如 CY 寄存器名 位 如 PSW 7 字節(jié)地址 位 如 D0H 7 標(biāo)志位CY在位操作指令中稱作位累加器 用符號(hào)C表示 3 8 1位傳送指令MOVC bit CY bit MOVbit C bit CY 顯然兩個(gè)位之間不能直接進(jìn)行傳送 必須通過位累加器C 3 8 2置位和清零指令CLRC CY 0CLRbit bit 0SETBC CY 1SETBbit bit 1 例3 32 要設(shè)定工作寄存器2區(qū)為當(dāng)前工作區(qū) 可用以下指令實(shí)現(xiàn) SETBRS1CLRRS0 3 8 3位邏輯運(yùn)算指令A(yù)NLC bit CY CY bit ANLC bit CY CY ORLC bit CY CY bit ORLC bit CY CY CPLC CY CPLbit bit 例3 33 用編程的方法實(shí)現(xiàn)圖3 2 2所示電路的功能 MOVC P1 1ORLC P1 2ANLC P1 0MOVP1 3 C 3 8 4 位條件轉(zhuǎn)移指令1 判CY的條件轉(zhuǎn)移指令JCrel 若 CY 1 則PC PC 2 rel若 CY 0 則PC PC 2JNCrel 若 CY 0 則PC PC 2 rel若 CY 1 則PC PC 2以上兩條指令均為2字節(jié)指令 若發(fā)生轉(zhuǎn)移 則轉(zhuǎn)移地址 PC 2 rel 例3 34 比較片內(nèi)RAM的50H和51H單元中兩個(gè)8位無符號(hào)數(shù)的大小 把大數(shù)存入60H單元 若兩數(shù)相等則把標(biāo)志位70H置1 相應(yīng)的程序?yàn)?MOVA 50HCJNEA 51H LOOPSETB70HRETLOOP JCLOOP1MOV60H ARETLOOP1 MOV60H 51HRET 2 判位變量的條件轉(zhuǎn)移JBbit rel 若 bit 1 則PC PC 3 rel若 bit 0 則PC PC 3JNBbit rel 若 bit 0 則PC PC 3 rel若 bit 1 則PC PC 3JBCbit rel 若 bit 1 則PC PC 3 rel且 bit 0若 bit 0 則PC PC 3第一條指令的功能是若bit位內(nèi)容為1 轉(zhuǎn)移到目標(biāo)地址 目標(biāo)地址 PC 3 rel 若為0 程序順序執(zhí)行 第二條指令的功能是是若bit位內(nèi)容為0 不為1 轉(zhuǎn)移到目標(biāo)地址 目標(biāo)地址 PC 3 rel 若為1 程序順序執(zhí)行 第三條指令的功能是若bit位內(nèi)容為1 則將bit位內(nèi)容清0 并轉(zhuǎn)移到目標(biāo)地址 目標(biāo)地址 PC 3 rel 若bit位內(nèi)容為0 程序順序執(zhí)行 例3 35 在片內(nèi)RAM30H單元中存有一個(gè)帶符號(hào)數(shù) 試判斷該數(shù)的正負(fù)性 若為正數(shù) 將6EH位清0 若為負(fù)數(shù) 將6EH位置1 方法一 MOVA 30H 30H單元中的數(shù)送AJBACC 7 LOOP 符號(hào)位等于1 是負(fù)數(shù) 轉(zhuǎn)移CLR6EH 符號(hào)位等于0 是正數(shù) 清標(biāo)志位RET 返回LOOP SETB6EH 標(biāo)志位置1RET 返回方法二 MOVA 30H 30H單元中的數(shù)送AANLA 80H 保留A中數(shù)據(jù)的最高位 其余位清0JNZLOOP 不等于0 是負(fù)數(shù) 轉(zhuǎn)移CLR6EH 等于0 是正數(shù) 清標(biāo)志位RET 返回LOOP SETB6EH 標(biāo)志位置1RET 返回 習(xí)題課 1 將片內(nèi)RAM30H單元與40H單元中的內(nèi)容互換 2 把外部數(shù)據(jù)存儲(chǔ)器2040H到2049H單元中的數(shù)據(jù)傳送到外部數(shù)據(jù)存儲(chǔ)器2060H到2069單元中去 注 考慮第一題有沒有多種方法- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(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ì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- MCS 51 單片機(jī) 指令系統(tǒng)
鏈接地址:http://m.kudomayuko.com/p-6380741.html