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