![MCS-51指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/2906e4e6-479c-4566-96d3-41141568c6ea/2906e4e6-479c-4566-96d3-41141568c6ea1.gif)
![MCS-51指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/2906e4e6-479c-4566-96d3-41141568c6ea/2906e4e6-479c-4566-96d3-41141568c6ea2.gif)
![MCS-51指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/2906e4e6-479c-4566-96d3-41141568c6ea/2906e4e6-479c-4566-96d3-41141568c6ea3.gif)
![MCS-51指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/2906e4e6-479c-4566-96d3-41141568c6ea/2906e4e6-479c-4566-96d3-41141568c6ea4.gif)
![MCS-51指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/2906e4e6-479c-4566-96d3-41141568c6ea/2906e4e6-479c-4566-96d3-41141568c6ea5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 1第第3 3章章 MCS-51MCS-51指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)指令系統(tǒng)與匯編語言程序設(shè)計基礎(chǔ)3.1 MCS-51指令系統(tǒng) 3.2 匯編語言程序設(shè)計基礎(chǔ) 習(xí)題3 2 2MCS-51系列單片機采用復(fù)雜指令系統(tǒng),共有42種操作碼助記符,支持直接尋址、寄存器尋址、間接尋址、立即數(shù)尋址、變址尋址、相對尋址及位尋址等七種尋址方式。不同指令操作碼助記符與不同尋址方式之間的組合構(gòu)成了MCS-51系列單片機的指令系統(tǒng),共111條。按功能可將這些指令分為數(shù)據(jù)傳送指令、算術(shù)運算指令、邏輯運算指令、控制轉(zhuǎn)移指令和位操作指令等五大類,每一類型的指令中又包含若干條指令。由于指令較多,使得許多初學(xué)者感到很難掌
2、握,其實只要理解每類指令的功能、助記符及其支持的尋址方式,即可從MCS-51指令表中找出完成特定操作所需的指令。3.1 MCS-51指令系統(tǒng)指令系統(tǒng)3 3本章在介紹MCS-51指令系統(tǒng)時,為方便敘述,使用了下列符號及約定:(1) Rn(n07):表示工作寄存器組R0R7中的某一寄存器。(2) Ri(i01):以寄存器R0或R1作間接尋址,表示操作數(shù)地址在寄存器R0或R1中。其中“”是間接尋址標(biāo)識符,操作對象是外部RAM或內(nèi)部RAM 00HFFH單元(對僅有前128字節(jié)內(nèi)部RAM的51子系列來說,地址范圍是00H7FH)。4 4(3) DPTR:以數(shù)據(jù)指針DPTR(16位)作間接尋址,操作數(shù)在外
3、部RAM中,“”同樣是間接尋址標(biāo)識符。(4) #data:8位立即數(shù);#data16:16位立即數(shù)。其中“#”是立即數(shù)標(biāo)識符,常用于初始化內(nèi)部RAM單元、特殊功能寄存器和數(shù)據(jù)指針DPTR中。(5) direct:8位直接地址,可以是內(nèi)部RAM 00H7FH單元字節(jié)地址、內(nèi)部RAM 20H2FH單元中的位地址或特殊功能寄存器的映像地址。5 5(6) /bit:在位操作中,取出“bit”位信息后,先取反,然后再參與運算,但不改變bit位的值,其中“/”是位取反標(biāo)識符。(7) rel:補碼形式的8位偏移地址,范圍在128127之間。(8) rrr:在操作碼中,用于表示R0R7寄存器的編碼。rrr編碼
4、與寄存器R0R7之間的對應(yīng)關(guān)系如下:6 6(9) addr11:11位目標(biāo)地址,用于ACALL(絕對調(diào)用)和AJMP(絕對跳轉(zhuǎn))指令中,轉(zhuǎn)移范圍為2KB。(10) addr16:16位目標(biāo)地址,用于LCALL和LJMP指令中,轉(zhuǎn)移范圍為64KB。(11) 操作數(shù)中的累加器A寫作“A”時是寄存器尋址,寫作“Acc”時是直接尋址,盡管操作對象均是CPU內(nèi)的累加器A。對于支持直接尋址和寄存器尋址的指令來說,用“A”和“Acc”均可,只是指令的操作碼不同;對于不支持寄存器尋址的指令(如PUSH、POP),則不能將累加器“Acc”寫作“A”;而對于不支持直接尋址的指令,如“MOVX”中的“A”也不能寫成
5、“Acc”。因此,在匯編語言指令中,須嚴(yán)格區(qū)分累加器A的寫法。7 7(12) 累加器A的內(nèi)容為nn時,用“Ann”表示;地址編碼為mm的存儲單元內(nèi)容用“(mm)”表示。(13) 指令執(zhí)行時間用“機器周期”度量。例如“MOV A,Rn”指令執(zhí)行時間為一個機器周期,在標(biāo)準(zhǔn)MCS-51中,一個機器周期包含12個振蕩周期(即時鐘周期)。如果晶振頻率為12MHz,則振蕩周期T1/12 s,因此一個機器周期為12T,即1s。對于運行在“6時鐘/機器周期”的8XC5XX2、89C51RX、P89C6XX2芯片來說,指令機器周期數(shù)不變,但指令執(zhí)行的時間縮短了一半;對于運行在“2時鐘/機器周期”的芯片LPC90
6、0系列來說,指令執(zhí)行時間只有標(biāo)準(zhǔn)MCS-51的1/6。(14) 指令機器碼一律用二進(jìn)制書寫。(15) 對于不常用或約束條件多、容易出錯的指令,在指令表中加灰色背景,程序設(shè)計時應(yīng)盡量避免使用這類指令。8 83.1.1 數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令數(shù)據(jù)傳送是計算機系統(tǒng)中最常見、最基本的操作。因此,數(shù)據(jù)傳送指令在計算機指令系統(tǒng)中占有重要位置,指令條數(shù)也最多。數(shù)據(jù)傳送指令的任務(wù)是實現(xiàn)計算機系統(tǒng)內(nèi)不同存儲單元之間的信息傳送,如圖3-1所示。在MCS-51指令系統(tǒng)中,數(shù)據(jù)傳送指令包括:(1) 內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令,這類指令用“MOV”作為指令操作碼助記符。(2) 外部RAM(包括擴展的
7、并行I/O口、內(nèi)部擴展RAM,即ERAM)與累加器A之間的數(shù)據(jù)傳送指令,這類指令用“MOVX”作為指令操作碼助記符。9 9圖3-1 MCS-51中不同存儲區(qū)之間數(shù)據(jù)傳送示意圖1010(3) 程序存儲器讀指令,即程序存儲器ROM與累加器A之間的數(shù)據(jù)傳送指令,這類指令用“MOVC”作為指令操作碼助記符。(4) 堆棧操作指令。(5) 字節(jié)交換指令。數(shù)據(jù)傳送指令一般不影響程序狀態(tài)字寄存器PSW中的標(biāo)志位,只有當(dāng)數(shù)據(jù)傳送到累加器A時,PSW中的奇偶標(biāo)志位P會改變,原因是奇偶標(biāo)志位P總是體現(xiàn)累加器A中“1”的個數(shù)的奇偶性。當(dāng)累加器ACC為0時,Z(零)標(biāo)志位置1;反之Z標(biāo)志清位零。因此,當(dāng)目的操作數(shù)為累加
8、器Acc時,數(shù)據(jù)傳送指令會影響Z標(biāo)志位。11111. 內(nèi)部內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令與特殊功能寄存器之間的數(shù)據(jù)傳送指令MCS-51內(nèi)部RAM和特殊功能寄存器之間的數(shù)據(jù)傳送指令的指令格式、機器碼以及執(zhí)行時間如表3-1所示。表表3-1 內(nèi)部內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令與特殊功能寄存器之間的數(shù)據(jù)傳送指令1212表表3-1 內(nèi)部內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令與特殊功能寄存器之間的數(shù)據(jù)傳送指令1313對表3-1的說明如下:(1) 低128字節(jié)內(nèi)部RAM(即00H7FH)各單元之間,以及特殊功能寄存器(地址分散在80HFFH之間)可以直接傳送,不一定要經(jīng)過累
9、加器A,例如:MOV 32H,90H ;將特殊功能寄存器90H單元中的(即P1口)內(nèi)容傳送至內(nèi)部RAM 32H單元中,;該指令中的目的操作數(shù)(內(nèi)部RAM 32H單元)和源操作數(shù)(特殊功能寄存器;90H單元)均使用了直接尋址方式MOV 32H,43H;將內(nèi)部RAM 43H單元中的內(nèi)容傳送至內(nèi)部RAM 32H單元中MOV P1,B ;將寄存器B中的內(nèi)容傳送至P1口鎖存器中1414(2) MCS-51指令系統(tǒng)約定:對于特殊功能寄存器,只能用直接尋址方式訪問;對于高128字節(jié)內(nèi)部RAM只能用寄存器間接尋址方式訪問。因此,在直接尋址方式中,當(dāng)直接地址在80HFFH之間時,操作對象是特殊功能寄存器,而不是
10、內(nèi)部RAM高128字節(jié)。對于地址編碼在80HFFH之間的內(nèi)部RAM,只能通過寄存器間接尋址訪問,例如:MOV R0,B ;假設(shè)該指令執(zhí)行前,R0內(nèi)容為90H,則該指令的含義是將特殊功能寄存器;B(地址為0F0H)中的內(nèi)容傳送至內(nèi)部RAM的90H單元中1515(3) 對于低128字節(jié)內(nèi)部RAM,可以用直接尋址方式訪問,也可以用寄存器間接尋址方式訪問,例如:MOV 32H,#23H ;將立即數(shù)23H傳送到內(nèi)部RAM的32H單元中,目的操作數(shù)使用了直;接尋址方式MOV R0,#23H ;假設(shè)該指令執(zhí)行前,R0中的內(nèi)容為32H,則該指令的作用與上條指令;相同,也是將立即數(shù)23H傳送到內(nèi)部RAM的32H
11、單元中,只是目的;操作數(shù)采用寄存器間接尋址方式1616(4) 對于特殊功能寄存器,在指令中無論是引用寄存器名還是直接給出寄存器映像地址,結(jié)果都一樣,只是書寫形式不同而已。匯編時匯編程序自動將寄存器名替換為對應(yīng)的映像地址,如“MOV P1,#23H”與“MOV 90H,#23H”完全等價。(5) 盡管寄存器B是CPU的內(nèi)部寄存器,但MCS-51指令系統(tǒng)沒有提供B寄存器的寄存器尋址方式(只有乘法指令例外),例如“MOV B,A”指令中目的操作數(shù)的尋址方式是直接尋址方式,并不是寄存器尋址方式。(6) 在同一指令中,只允許其中一個操作數(shù)使用寄存器間接尋址方式,因而“MOV R0,R1”指令不存在。也正
12、因如此,內(nèi)部RAM高128字節(jié)之間不能直接傳送,必須通過累加器A或內(nèi)部RAM作為中介,例如,將內(nèi)部RAM的82H單元傳送到內(nèi)部RAM的8FH單元時,可用如下指令實現(xiàn):1717MOV R0, #82HMOV A,R0MOV R0,#8FHMOV R0, A例例3.1 在仿真機上,用單步方式執(zhí)行下列指令,并觀察指令執(zhí)行前后,內(nèi)部RAM有關(guān)單元內(nèi)容和程序狀態(tài)字寄存器PSW中Cy、AC、OV、P等標(biāo)志位的變化,了解數(shù)據(jù)傳送指令對標(biāo)志位的影響。1818參考程序如下:MOV 30H, #01H;把立即數(shù)01H傳送到內(nèi)部RAM 30H單元MOV A,30H;該指令執(zhí)行后累加器A中的內(nèi)容為01H,含有奇數(shù)個“
13、1”,因此P標(biāo)志;位為1MOV A, #03H;該指令執(zhí)行后累加器A中的內(nèi)容為03H,含有偶數(shù)個“1”,因此P標(biāo)志;位為0MOV 30H, #07H;執(zhí)行后,30H單元內(nèi)容也是07H,但傳送的目的地址不是累加器A,因;此標(biāo)志位沒有變化19192. 外部外部RAM及及I/O端口與累加器端口與累加器A之間的數(shù)據(jù)傳送指令之間的數(shù)據(jù)傳送指令在MCS-51系統(tǒng)中,由于擴展I/O端口與外部RAM統(tǒng)一編碼,即擴展I/O端口地址占用外部RAM地址空間的某一單元,因此外部RAM及擴展I/O端口的讀/寫操作指令和操作時序完全相同,且只能通過累加器A存取外部RAM和擴展I/O端口。這類指令操作碼助記符為“MOVX”
14、,其中“X”的含義是“eXternal”(外部),其指令格式、機器碼以及執(zhí)行時間如表3-2所示。2020表表3-2 外部外部RAM與累加器與累加器A之間的數(shù)據(jù)傳送指令之間的數(shù)據(jù)傳送指令2121對表3-2的說明如下:(1) 當(dāng)通過DPTR寄存器間接尋址方式讀/寫外部RAM及擴展I/O端口時,先將16位外部RAM地址或I/O端口地址放在數(shù)據(jù)指針DPTR寄存器中(DPTR寄存器就是為了訪問外部RAM而設(shè)置的),然后以DPTR作間接尋址寄存器,通過累加器A進(jìn)行讀/寫,這時外部RAM低8位地址A7A0通過P0口輸出,高8位地址A15A8通過P2口輸出。下面以讀/寫外部RAM的3FFFH存儲單元為例,介紹
15、外部RAM讀/寫方法。2222MOV DPTR,#3FFFH ;將要讀/寫的外部RAM存儲單元地址3FFFH以立即數(shù)形式傳送;到DPTR寄存器中MOVX A,DPTR ;將DPTR指定的外部存儲單元(3FFFH)內(nèi)容送累加器A中(讀外部;RAM)MOVX DPTR, A ;將累加器A輸出到DPTR指定的外部存儲單元(3FFFH)中(寫外部;RAM)2323(2) 當(dāng)通過R0或R1寄存器間接尋址方式讀/寫外部RAM或擴展I/O端口時,先將外部RAM存儲單元或I/O端口低8位地址放在R0或R1寄存器中,然后以R0或R1作間接尋址寄存器,通過累加器A進(jìn)行讀/寫,這時外部RAM低8位地址A7A0通過P
16、0口輸出,尋址范圍是256個存儲單元。在讀寫期間P2口處于I/O方式,且P2口鎖存器不變。因此,使用Ri間接尋址方式訪問外部RAM具有更大的靈活性,即在沒有外部程序存儲器的情況下,當(dāng)外部RAM容量小于256字節(jié),且通過Ri間接尋址讀/寫外部RAM或擴展的I/O端口時,可將P2口作為一般I/O口使用,以增加I/O引腳數(shù)目;當(dāng)外部RAM容量大于256字節(jié),且以頁面方式讀寫外部RAM時,P2口中沒有使用的I/O引腳,可以作為輸出引腳使用。下面仍以讀寫外部RAM的3FFFH存儲單元為例,介紹通過Ri間接尋址讀寫外部RAM的方法。2424MOV P2, #3FH;將要讀/寫的外部RAM存儲單元高8位地址
17、3FH以立即數(shù)方式傳送;到P2口中(寫入P2口鎖存器)MOV R1,#0FFH ;將要讀/寫的外部RAM存儲單元低8位地址0FFH以立即數(shù)方式傳送;到R1寄存器中MOVX A,R1 ;將R1指定的外部存儲單元低8位地址0FFH通過P0口輸出,由于;P2口保持不變,結(jié)果外部RAM 3FFFH單元被選中,并讀入累加器A中MOVX R1,A ;將R1指定的外部存儲單元低8位地址0FFH通過P0口輸出,由于2525 ;P2口保持不變,外部RAM的3FFFH單元被選中,結(jié)果累加器A的內(nèi);容傳送到3FFFH單元(寫入)由于外部RAM與內(nèi)部RAM之間不能直接傳送,因此當(dāng)需要將外部RAM中的內(nèi)容傳送到內(nèi)部RA
18、M中時,可通過累加器A作中介來實現(xiàn)傳送。例如,通過如下指令將外部RAM 3FFFH單元內(nèi)容傳送到內(nèi)部RAM 2FH單元:2626MOV DPTR,#3FFFH;將外部RAM地址以立即數(shù)方式送數(shù)據(jù)指針DPTRMOVX A,DPTR ;將外部RAM 3FFFH單元內(nèi)容讀到累加器A中MOV 2FH,A ;將累加器A中的內(nèi)容送內(nèi)部RAM 2FH單元中外部RAM不同存儲單元之間也不能直接傳送,也需要通過累加器A作中介來實現(xiàn)傳送。2727例例3.2 將外部RAM的0100H單元內(nèi)容傳送到0120H單元中(兩單元之間的數(shù)據(jù)傳送)。參考程序如下:MOV DPTR, #0100H;DPTR單元地址0100HMO
19、VX A, DPTR;Acc0100H單元內(nèi)容MOV DPTR, #0120H;DPTR單元地址0120HMOVX DPTR, A;0120H單元Acc2828例例3.3 將外部RAM 0080H009FH單元,共32字節(jié)的內(nèi)容傳送到以00C0H為首址地址的外部RAM中。分析:對于標(biāo)準(zhǔn)MCS-51來說,在外部RAM之間進(jìn)行批量數(shù)據(jù)傳送時,可先將外部RAM數(shù)據(jù)傳送到內(nèi)部RAM中,然后再傳送到外部RAM的目標(biāo)地址。參考程序如下:;先將外部RAM數(shù)據(jù)傳送內(nèi)部RAM 30H4FH中MOV R0, #30HMOV R7,#32MOV DPTR, #0080H2929LOOP1:MOVX A, DPTRM
20、OV R0,AINC DPTRINC R0DJNZ R7,LOOP13030;再將暫存于內(nèi)部RAM 30H4FH中的數(shù)據(jù)送外部RAM目標(biāo)地址中MOV R0,#30HMOV R7,#32MOV DPTR,#00C0HLOOP2:MOV A,R0MOVX DPTR,AINC DPTRINC R0DJNZ R7,LOOP3131如果利用增強型MCS-51雙DPTR指針,則完成外部RAM不同區(qū)域之間的數(shù)據(jù)傳送要簡單得多,如實現(xiàn)上述數(shù)據(jù)傳送的程序可改為:MOV R7, #32;定義傳送字節(jié)數(shù)MOV DPTR,,#0080H;數(shù)據(jù)塊在外部RAM首地址送第一個DPTR指針I(yè)NC AUXR1;切換數(shù)據(jù)指針,指
21、向目標(biāo)地址MOV DPTR, #00C0H;外部RAM目標(biāo)地址傳送另一個DPTR指針 LOOP:INC AUXR1;切換DPTR指針,指向源地址3232MOVXA,DPTR;取外部RAM數(shù)據(jù)INC DPTRINC AUXR1;切換DPTR指針,指向目標(biāo)地址MOVX DPTR,,A;數(shù)據(jù)送外部RAM目標(biāo)地址INC DPTRDJNZ R7, LOOP ;循環(huán),直到32字節(jié)內(nèi)容傳送完可見,利用雙DPTR指針后,程序段結(jié)構(gòu)簡潔,也無需使用內(nèi)部RAM作緩沖。33333. 累加器累加器A與程序存儲器與程序存儲器ROM之間的數(shù)據(jù)傳送指令之間的數(shù)據(jù)傳送指令為了取出存放在程序存儲器中的表格數(shù)據(jù),MCS-51提供
22、了兩條查表指令,這兩條指令的操作碼助記符為“MOVC”,其中“C”的含義是“Code(代碼)”,表示操作對象是程序存儲器,其指令格式、機器碼以及執(zhí)行時間如表3-3所示。表表3-3 查查 表表 指指 令令3434這兩條查表指令中,“MOVC A,ADPTR”指令以DPTR內(nèi)容作為基址,加上累加器A的內(nèi)容后,所得的16位二進(jìn)制數(shù)作為待讀出的程序存儲器單元地址,并將該單元的內(nèi)容送到累加器A中。這條指令主要用于查表,例如在程序存儲器中,依次存放0F的七段共陰數(shù)碼顯示器的字模碼3F、06、5B、4F、66、6D、7D、07、7F、6F、77、7C、39、5E、79、71,則當(dāng)需要在P1口輸出某一數(shù)碼,如
23、“3”時,可通過如下指令實現(xiàn):MOV DPTR,#2000H;假設(shè)字模存放在從2000H單元開始的程序存儲器中,通過該指令3535;將字模首地址傳送到DPTR寄存器中MOVA,#03H;把待顯示的數(shù)碼傳送到累加器A中MOVCA,A+DPTR ;2000H03H,即2003H單元的內(nèi)容(4F)讀到累加器A中MOV P1,A;將數(shù)碼“3”對應(yīng)的字模碼“4F”輸出到P1口ORG2000HDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H7FH,6FH,77H,7CH,39H,5EH,79H,71H3636從程序存儲器中讀出某一字節(jié)時,也可以使用PC內(nèi)容作為基址,通過“MOVC A,
24、APC”指令取出。但使用這條指令讀取ROM中表格數(shù)據(jù)時,表格數(shù)據(jù)項必須位于該指令后,其靈活性差。例如:MOV A,#03H;把待顯示的數(shù)碼傳送到累加器A中INC A;因MOVC后的短跳轉(zhuǎn)指令占兩個字節(jié),表頭與MOVC指令差2字節(jié)3737INC AMOVC A,A+PC;PC03H單元內(nèi)容(4F)讀到累加器A中SJMP NEXT ;跳過數(shù)據(jù)表,否則CPU會將數(shù)據(jù)表當(dāng)指令執(zhí)行DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HNEXT:由于程序存儲器只能讀出不能寫入,因此,也就沒有寫程序存儲器指令。38384. 堆棧操
25、作指令堆棧操作指令堆棧操作也是計算機系統(tǒng)基本操作之一。設(shè)置堆棧操作的目的是為了迅速保護(hù)斷點和現(xiàn)場,以便在子程序或中斷服務(wù)子程序運行結(jié)束后,能正確返回主程序。MCS-51堆棧操作的指令格式、機器碼以及執(zhí)行時間如表3-4所示。表表3-4 堆棧操作指令堆棧操作指令3939有關(guān)MCS-51堆棧操作的過程已在第2章中介紹過,這里只強調(diào)堆棧操作應(yīng)注意的問題:(1) MCS-51堆棧操作指令中的操作數(shù)只能使用直接尋址方式,不能使用寄存器尋址方式,如將累加器A壓入堆棧時,指令格式為:PUSH Acc ;Acc是累加器A的寄存器名,本質(zhì)上屬于直接尋址在堆棧操作指令中,累加器Acc不能簡寫為A。4040(2) 在
26、子程序開始處安排若干條PUSH指令,把需要保護(hù)的特殊功能寄存器內(nèi)容壓入堆棧(即內(nèi)部RAM);在子程序返回指令前安排相應(yīng)的POP指令,將寄存器原來的內(nèi)容彈出。PUSH和POP指令必須成對出現(xiàn),且入棧順序與出棧順序相反,因此子程序結(jié)構(gòu)如下:PUSH PSW ;保護(hù)現(xiàn)場PUSH Acc. ;子程序?qū)嶓wPOP Acc ;恢復(fù)現(xiàn)場POP PSWRET;子程序返回41415. 字節(jié)交換指令字節(jié)交換指令字節(jié)交換指令也屬于數(shù)據(jù)傳送指令范疇,不過交換后,源操作數(shù)與目的操作數(shù)的內(nèi)容相互對調(diào)。MCS-51提供了四條字節(jié)交換指令和兩條半字節(jié)交換指令,其指令格式、機器碼以及執(zhí)行時間如表3-5所示。表表3-5 字節(jié)交換指
27、令字節(jié)交換指令4242由于字節(jié)交換指令的第二操作數(shù)支持寄存器尋址、直接尋址和間接尋址方式,因此內(nèi)部RAM(00HFFH)和特殊功能寄存器中的任一單元均可以與累加器A進(jìn)行交換。但半字節(jié)交換指令中的第二操作數(shù)僅支持寄存器間接尋址方式,因此僅有內(nèi)部RAM低4位能與累加器A低4位(b3b0)直接交換。4343例例3.4 假設(shè)累加器A的內(nèi)容為12H,R0的內(nèi)容為34H,則執(zhí)行:XCH A,R0指令執(zhí)行后,累加器A的內(nèi)容為34H,R0的內(nèi)容為12H,即A和R0的內(nèi)容交換了??梢姡@與數(shù)據(jù)傳送指令不同,數(shù)據(jù)傳送指令執(zhí)行后,源操作數(shù)內(nèi)容將覆蓋目的操作數(shù)原來的內(nèi)容。例例3.5 假設(shè)累加器A的內(nèi)容為1EH,R0的
28、內(nèi)容為2FH,內(nèi)部RAM 2FH單元的內(nèi)容為37H,則執(zhí)行:XCHD A,R0指令執(zhí)行后,累加器A的內(nèi)容為17H,內(nèi)部RAM 2FH單元的內(nèi)容將為3EH,即累加器A與寄存器R0指定的內(nèi)部RAM單元的低4位對調(diào),而高4位不變。44443.1.2 算術(shù)運算指令算術(shù)運算指令MCS-51提供了豐富的算術(shù)運算指令,如加法指令、減法指令、增1指令、減1指令以及乘法、除法指令等。一般情況下,算術(shù)運算指令執(zhí)行后會影響程序狀態(tài)字寄存器PWS中相應(yīng)的標(biāo)志位。1. 加法指令加法指令加法指令操作碼助記符、指令格式以及機器碼等如表3-6所示。4545表表3-6 MCS-51加法指令加法指令4646對表3-6的說明如下:
29、(1) 所有加法指令的目的操作數(shù)均是累加器A,源操作數(shù)支持寄存器尋址、直接尋址、寄存器間接尋址和立即數(shù)尋址四種尋址方式,因此加數(shù)(即源操作數(shù))可以是內(nèi)部RAM(00HFFH)、特殊功能寄存器或8位立即數(shù)。加法運算的結(jié)果存放在累加器A中。(2) 加法指令執(zhí)行后將影響進(jìn)位標(biāo)志位Cy、溢出標(biāo)志位OV、輔助進(jìn)位標(biāo)志位AC以及奇偶標(biāo)志位P。 兩數(shù)相加后,若b7位有進(jìn)位,則Cy為1;反之為0。b7有進(jìn)位,則表示兩個無符號數(shù)相加,結(jié)果大于255,和的低8位存放在累加器A中。4747 計算機并不知道參加運算的兩個數(shù)是無符號數(shù)還是有符號數(shù),程序員只能借助溢出標(biāo)志位OV來判別帶符號數(shù)相加是否溢出。對于帶符號數(shù)來說
30、,b7位是符號位(0表示正數(shù),1表示負(fù)數(shù)),且負(fù)數(shù)用補碼表示。于是,當(dāng)兩個正數(shù)相加時,如果累加器A的b7位為1,則表示結(jié)果是負(fù)數(shù),但這是不可能的,實際上這兩個正數(shù)的和大于127;同理,當(dāng)兩個負(fù)數(shù)相加時,如果累加器A的b7位為0,則表示結(jié)果是正數(shù),這同樣也是不可能的,實際上這兩個負(fù)數(shù)的和小于128。即在加法指令中,溢出標(biāo)志位OV置1的條件是:兩個操作數(shù)的符號相同(即b7位同為0或1),但運算結(jié)果的符號位與操作數(shù)相反。對于帶符號數(shù)的加法運算來說,當(dāng)溢出標(biāo)志位OV為1時,結(jié)果不正確。4848 兩數(shù)相加后,若b3位向b4位進(jìn)位,則AC為1;反之為0。 由于奇偶標(biāo)志位P總是體現(xiàn)累加器A中“1”的奇偶性,
31、因此P也會改變。(3) 帶進(jìn)位加法指令中的累加器A除了加源操作數(shù)外,還需要加上程序狀態(tài)字寄存器PSW中的進(jìn)位標(biāo)志位Cy。設(shè)置帶進(jìn)位加法指令的目的是為了實現(xiàn)多字節(jié)加法運算。例如,可通過如下指令將存放在30H、31H單元中的16位二進(jìn)制數(shù)與存放在32H、33H單元中的16位二進(jìn)制數(shù)相加(假設(shè)結(jié)果存放在30H、31H中):4949MOV A,30H;將被加數(shù)低8位傳送到寄存器A中ADD A,32H;與加數(shù)低8位(32H單元內(nèi)容)相加,結(jié)果存放在A中MOV 30H,A;將和的低8位保存到30H單元中MOV A,31H;將被加數(shù)高8位傳送到寄存器A中ADDC A,33H;與加數(shù)高8位(33H單元內(nèi)容)相
32、加,結(jié)果存放在A中。由于低8位相加;時,結(jié)果可能大于0FFH,產(chǎn)生進(jìn)位,因此高8位相加時用ADDC指令MOV 31H,A;將和的高8位保存到31H單元中50502. 減法指令減法指令減法指令操作碼助記符、指令格式以及機器碼如表3-7所示。表表3-7 MCS-51減法指令減法指令5151MCS-51只有帶借位的減法指令,被減數(shù)是累加器A,減數(shù)可以是內(nèi)部RAM、特殊功能寄存器或立即數(shù),運算結(jié)果存放在累加器A中。與加法指令類似,操作結(jié)果同樣會影響標(biāo)志位: Cy為1,表示被減數(shù)小于減數(shù),產(chǎn)生借位。 OV同樣用于判別兩個帶符號數(shù)相減后,差是否超出8位帶符號數(shù)所能表示的范圍(128127)。當(dāng)兩個異號數(shù)相
33、減時,差的符號與被減數(shù)相反,則溢出標(biāo)志位OV為1,表明結(jié)果不正確。例如,被減數(shù)為正數(shù),減數(shù)為負(fù)數(shù),相減后,結(jié)果應(yīng)該是正數(shù),但如果累加器A的b7為1,即負(fù)數(shù),則表明結(jié)果不正確。5252 兩數(shù)相減時,如果b3位向b4位借位,則AC為1;反之為0。 奇偶標(biāo)志位P總是體現(xiàn)累加器A中“1”的奇偶性,因此P也會改變。由于MCS-51指令系統(tǒng)只有帶借位的減法指令,因此,當(dāng)需要執(zhí)行不帶借位的減法指令時,應(yīng)先執(zhí)行“CLR C”指令,將進(jìn)位標(biāo)志Cy清零。5353例例3.6 用減法指令求內(nèi)部RAM兩單元的差值(假設(shè)被減數(shù)存放在內(nèi)部RAM 30H單元中,減數(shù)存放在31H單元中,差放在40H單元中)。參考程序如下:MO
34、V A,30H;被減數(shù)送寄存器ACLR C;進(jìn)位標(biāo)志Cy清零SUBB A,31H;減31H單元MOV 40H,A ;結(jié)果保存到40H單元54543. 加加1指令指令加1指令也稱為“增量指令”,操作結(jié)果是使操作數(shù)加1。加1指令操作碼助記符、指令格式以及機器碼等如表3-8所示。表表3-8 MCS-51加加1指令指令5555加1指令不影響標(biāo)志位,只有操作對象為累加器A時,才影響奇偶標(biāo)志位P。當(dāng)操作數(shù)初值為0FFH,則加1后將變?yōu)?0H。盡管加1指令與加數(shù)為1的加法指令同樣會使操作數(shù)增,但彼此并不完全相同,例如:INC A ;通過增量指令使累加器A內(nèi)容加1該指令除了影響奇偶標(biāo)志位P外,不影響其他標(biāo)志位
35、。ADD A, #01H;通過加法指令使累加器A內(nèi)容加1該指令同樣會使累加器A內(nèi)容加1,但該指令將影響Cy、OV、AC以及P標(biāo)志位,且指令機器碼占用兩個字節(jié)。當(dāng)操作數(shù)是某一I/O口,如“INC P1”時,先將P1口鎖存器內(nèi)容讀出,加1后,再寫入P1口鎖存器中,因此INC Pi(i0,1,2,3)屬于“讀改寫”指令。56564. 減減1指令指令減1指令的操作結(jié)果是使操作數(shù)減1。減1指令操作碼助記符、指令格式以及機器碼等如表3-9所示。表表3-9 MCS-51減減1指令指令5757與加1指令情況類似,減1指令也不影響標(biāo)志位,只有當(dāng)操作數(shù)是累加器A時,才影響奇偶標(biāo)志位P。當(dāng)操作數(shù)的初值為00H時,減
36、1后,結(jié)果將變?yōu)镕FH。其他情況與加1指令類似。58585. 乘法指令乘法指令MCS-51提供了8位無符號數(shù)乘法指令,該指令操作碼助記符、指令格式以及機器碼等如表3-10所示。乘法指令的被乘數(shù)放在累加器A(8位無符號數(shù))中,乘數(shù)放在寄存器B(8位無符號數(shù))中,乘積(16位無符號數(shù))的高8位放在寄存器B中,低8位放在累加器A中。表表3-10 MCS-51乘法指令乘法指令5959乘法指令對標(biāo)志位的影響如下:當(dāng)結(jié)果大于255時,OV為1;反之為0。進(jìn)位標(biāo)志位Cy總為0。AC保持不變。奇偶標(biāo)志位P隨累加器A中“1”的個數(shù)的改變而改變。MCS-51沒有提供8位16位、16位16位、16位24位等多字節(jié)乘
37、法指令,只能通過單字節(jié)乘法指令實現(xiàn)多字節(jié)乘法運算。例如,24位16位可通過如下算法實現(xiàn): 24位被乘數(shù)占用3字節(jié),用CBA表示;16位乘數(shù)占用2字節(jié),用ED表示,乘積應(yīng)該為40位。顯然“A*D”為16位,“B*D”為24位,“C*D”為32位;“A*E”為24位,“B*E”為32位,“C*E”為40位。因此,可采用如圖3-2所示的算法完成24位16位運算。6060圖3-2 24位16位算法圖6161例例3.7 試編寫一程序段實現(xiàn)24位16位運算。參考程序如下:;假設(shè)24位被乘數(shù)存放存在45H、46H、47H單元中,乘數(shù)存放在48H、49H單元中;40位乘積保存在40H、41H、42H、43H、
38、44H單元中PROC MUL2416;24位6位運算子程序MUL2416;乘數(shù)低8位乘被乘數(shù)低8位 MOV A,49H ;乘數(shù)低8位 MOV B, 47H;取被乘數(shù)低8位 MUL AB MOV 44H, A;保存乘積低8位(b7b0) MOV 43H,B;保存乘積高8位(b15b8)6262 ;乘數(shù)低8位乘被乘數(shù)次高8位 MOV A,49H;取乘數(shù)低8位 MOV B,46H;取被乘數(shù)次高8位 MUL AB ADD A, 43H;乘積低8位(b15b8) MOV 43H, A ;保存b15b8 CLR A ADDC A,B;乘積高8位Cy MOV 42H,A;保存b23b166363 ;乘數(shù)低8
39、位乘被乘數(shù)最高8位 MOV A, 49H;取乘數(shù)低8位 MOV B,45H ;取被乘數(shù)最高8位 MUL AB ADD A,42H;加b23b16 MOV 42H, A;保存結(jié)果b23b16 CLR A ADDC A,B;加進(jìn)位標(biāo)志Cy MOV 41H,A;保存b31b246464 ;乘數(shù)高8位乘被乘數(shù)低8位 MOV A,48H;取乘數(shù)高8位 MOV B,47H;取被乘數(shù)低8位 MUL AB ADD A, 43H;乘積低8位(b15b8) MOV 43H, A;保存b15b8 MOV A,42H;取b23b16 ADDC A, B;乘積高8位(b23b16)Cy MOV 42H, A;保存b23
40、b16 CLR A ADDC A,41H ;(b31b24)Cy MOV 41H, A;保存b31b24 CLR A ADDC A,#0;加進(jìn)位標(biāo)志Cy MOV 40H, A;保存b39b336565;乘數(shù)高8位乘被乘數(shù)次高8位 MOV A,48H;取乘數(shù)高8位 MOV B,46H;取被乘數(shù)次高8位 MUL AB ADD A,42H;乘積低8位(b23b16) MOV 42H, A ;保存b23b16 MOV A,41H;取b31b24 ADDC A,B;乘積高8位(b31b24) Cy MOV 41H,A;保存b31b24 CLR A ADDC A,40H;b39b33進(jìn)位標(biāo)志Cy MOV
41、40H,A;保存b39b336666;乘數(shù)高8位乘被乘數(shù)最高8位MOV A,48H;取乘數(shù)高8位MOV B,45H;取被乘數(shù)最高8位MUL ABADD A,41H;乘積低8位(b31b24)MOV 41H,A;保存b31b24MOV A,40H;取b39b33ADDC A,B;加乘積高8位(b39b33)CyMOV 40H,A;保存b39b33RETEND67676. 除法指令除法指令MCS-51提供了8位無符號數(shù)除法指令,該指令操作碼助記符、指令格式以及機器碼等如表3-11所示。除法指令的被除數(shù)(8位無符號數(shù))放在累加器A中,除數(shù)(8位無符號數(shù))放在寄存器B中,商(8位無符號數(shù))放在累加器A
42、中,余數(shù)(8位無符號數(shù))放在寄存器B中。顯然余數(shù)取值范圍為0(除數(shù)1)。表表3-11 MCS-51除法指令除法指令6868除法指令對標(biāo)志位的影響如下: 如果除數(shù)(即寄存器B)不為0,指令執(zhí)行后,溢出標(biāo)志位OV、進(jìn)位標(biāo)志位Cy總為0。 如果除數(shù)為0,指令執(zhí)行后,結(jié)果將不確定,OV置1,Cy仍為0。 AC保持不變。 奇偶標(biāo)志位P隨累加器A中“1”的個數(shù)的改變而改變。盡管MCS-51沒有提供16位8位、32位16位等多位除法運算指令,但可以借助減法或類似多項式除法的運算規(guī)則完成多位除法運算(參考例3.25)。69697十進(jìn)制加法調(diào)正指令十進(jìn)制加法調(diào)正指令在介紹十進(jìn)制加法調(diào)正指令前,先來看BCD碼加法
43、運算存在的問題。例例3.8 BCD碼25存放在累加器A中,即A=00100101B;另一BCD碼36存放在寄存器R2中,即R2=00110110B。當(dāng)兩個BCD碼通過“ADD A,R2”指令相加時,CPU會將其視為兩個二進(jìn)制數(shù)相加,運算結(jié)果如下: A 0 0 1 0 0 1 0 1 R20 0 1 1 0 1 1 0 A 0 1 0 1 1 0 1 1 (結(jié)果是5BH,即十進(jìn)制的91)7070實際上,253661。之所以得不到正確結(jié)果是因為在BCD中,用二進(jìn)制表示十進(jìn)制數(shù)時,僅使用09,即二進(jìn)制00001001共10個數(shù)碼。因此相加后,當(dāng)?shù)?位(即BCD碼個位)大于1001時,應(yīng)該加06H,使
44、低4位向b4進(jìn)位,這樣才能獲得正確結(jié)果。例如: A 0 10 1 1 0 1 16校正0 0 0 0 0 1 0 1 A 0 1 1 0 0 0 0 1 (結(jié)果是61)顯然,高4位也存在類似情況,即運算結(jié)果需要加60H進(jìn)行校正。下面再來看在另一種情況下,即低4位向高4位進(jìn)位時,也需要校正。7171例例3.9 假設(shè)BCD碼19存放在累加器A中,即A00011001B;另一BCD碼38存放在寄存器R2中,即R200111000B。當(dāng)兩個BCD碼通過“ADD A,R2”指令相加時,運算結(jié)果如下: A 0 0 0 1 1 0 0 1 R20 0 1 1 1 0 0 0 A 0 1 0 1 0 0 0
45、1 (結(jié)果是51H,即十進(jìn)制的81)7272實際上,193857。之所以得不到正確結(jié)果是因為8917,在二進(jìn)制加法中為11H,所以同樣需要加6進(jìn)行校正。因此,當(dāng)b3位向b4位進(jìn)位,即輔助進(jìn)位標(biāo)志位AC有效時,要加6校正。事實上,設(shè)置輔助進(jìn)位標(biāo)志位AC的目的主要是為了判別BCD碼加法運算是否需要校正。同樣,高位也存在類似問題,當(dāng)b7有進(jìn)位,即Cy為1時,也需要加60H進(jìn)行校正。可見,用ADD指令完成BCD碼加法運算時,若高4位或低4位大于1001,以及AC或Cy有效,則必須加06H、60H或66H進(jìn)行校正才能獲得正確的結(jié)果。十進(jìn)制加法調(diào)正指令就是為此而設(shè)置,該指令操作碼助記符、指令格式以及機器碼
46、等如表3-12所示。7373表表3-12 MCS-51 BCD碼加法調(diào)正指令碼加法調(diào)正指令十進(jìn)制加法調(diào)正指令用于BCD碼加法校正,需放在ADD指令之后,例如:ADD A,R2 ;兩個BCD碼相加DA A ;將累加器A中的結(jié)果校正后轉(zhuǎn)化為BCD需要注意的是,十進(jìn)制調(diào)正指令只能放在加法指令后,不能單獨使用“DA A”指令將累加器A中的內(nèi)容轉(zhuǎn)化為BCD碼。7474MCS-51沒有提供BCD碼減法調(diào)正指令,但可以通過“補碼”概念,將BCD碼減法運算變成BCD碼加法運算。我們知道兩位BCD碼可以表示0099,需要用8位二進(jìn)制存放;三位BCD碼可以表示000999,需要用12位二進(jìn)制存放;四位BCD碼可以
47、表示00009999之間的數(shù),需要用16位二進(jìn)制存放。因此,對于兩位BCD碼有:XYxyXY100 xy式中,由于100的BCD碼需要用12位二進(jìn)制存放,因此其中的1自然丟失。當(dāng)XYxy時,“XY100 xy”就是XYxy;當(dāng)XYxy時,“XY100 xy”是“XYxy”的補碼。為了能用減法指令求出“100 xy”的BCD碼,可用“9AH”表示“100 xy”算式中的十進(jìn)制數(shù)“100”(因為“9AH”加“6”調(diào)正后正好是“100H”)。7575例例3.10 假設(shè)兩位BCD碼形式的被減數(shù)和減數(shù)分別存放在VAR1和VAR2單元中,試編寫一程序段求“VAR1VAR2”,結(jié)果存放在VAR3單元中。參考
48、程序如下:CLR C;進(jìn)位標(biāo)志位Cy清零MOV A,#9AH;把BCD碼“100”的等效表示碼送累加器ASUBB A, VAR2;計算“100VAR2”,結(jié)果為BCD碼形式ADD A, VAR1;加被減數(shù)DAA;調(diào)正MOVVAR3, A;保存“VAR1VAR2”結(jié)果7676例例3.11 將R2中以壓縮形式存放的兩位BCD碼減1。分析:與上例有所不同,減1相當(dāng)于加99(其實9AH減1就是99H)。因此,現(xiàn)實兩位BCD碼減1的程序如下:MOV A,R2ADD A,#99HDA AMOV R2,A對于三位BCD碼有:XYZxyzXYZ1000 xyz當(dāng)XYZxyz時,“XYZ1000 xyz”就是X
49、YZ-xyz;當(dāng)XYZxyz時,“XYZ1000 xyz”是“XYZxyz”的補碼。同理,為了能用減法指令求出“1000 xyz”的BCD碼,可用“99AH”表示“1000 xyz”算式中的十進(jìn)制數(shù)“1000”(因為“99AH”加“6”調(diào)正后正好是“1000H”)。7777例例3.12 三位壓縮形式BCD碼被減數(shù)存放在81H、80H單元中,減數(shù)存放在31H、30H單元中,試編寫一段程序求出兩者的差,結(jié)果存放在81H、80H單元中。參考程序如下:CLR CMOV A, #9AHSUBB A, 30H;低8位相減MOV R2,A;暫時保存低8位中間結(jié)果MOV A,#09HSUBBA, 31H;高4
50、位相減ANL A,#0FH;屏蔽高位MOV R3,A;暫時保存高8位中間結(jié)果7878MOV R0,#80HMOV A,R0;取被減數(shù)低8位ADDA,R2;低8位相加DA A;調(diào)正MOV R0, A;保存和的十位、個位INC R0;R0加1MOV A,R0;取被減數(shù)百位ADDCA,R3;百位相加DA A;調(diào)正ANLA,#0FH;屏蔽高4位MOV R0,A;保存百位7979例例3.13 將R3、R2中以壓縮形式存放的三位BCD碼減1。分析:三位BCD減1,相當(dāng)于加999(其實99AH減1就是999H)。因此,現(xiàn)實三位BCD碼減1的程序如下:MOV A, R2;取十位、個位ADD A,#99HDA
51、AMOV R2, A;保存加99后的十位、個位結(jié)果MOV A,R3;取百位 ADDC A,#09HDA A;百位加9并調(diào)正ANL A,#0FH;屏蔽高4位MOV R3,A;保存百位80803.1.3 邏輯運算指令邏輯運算指令邏輯運算指令在計算機指令系統(tǒng)中的重要性并不亞于算術(shù)運算指令。MCS-51提供了豐富的邏輯運算指令,包括邏輯非(取反)、與、或、異或以及循環(huán)移位操作等。邏輯運算指令格式、操作碼助記符以及機器碼等如表3-13所示。8181表表3-13 MCS-51邏輯運算指令邏輯運算指令8282表表3-13 MCS-51邏輯運算指令邏輯運算指令8383這類指令的特點是不影響程序狀態(tài)字寄存器PS
52、W中的標(biāo)志位。只有帶進(jìn)位Cy循環(huán)移位時,才影響Cy和奇偶標(biāo)志位P。邏輯運算均按位進(jìn)行。例如,當(dāng)A=10100101B時,執(zhí)行“ANL A, # 01011010B”指令后,累加器A為0。常用邏輯與(ANL)指令用于將操作數(shù)中指定位清零,如可通過如下指令將P1口鎖存器的b4、b2位清零,而其他位不變。ANL P1,#11101011B 在構(gòu)造立即數(shù)時,希望清零位取0,其他位取1。該指令執(zhí)行后,P1口鎖存器各位為xxx0 x0 xx,可見指定位為0,其他位保持不變。 8484 常用邏輯或(ORL)指令用于將操作數(shù)中指定位置1,如可通過如下指令將P1口鎖存器的b4、b2位置1,而其他位不變。ORL
53、P1, #00010100B 在構(gòu)造立即數(shù)時,希望置1位取1,其他位取0。該指令執(zhí)行后,P1口鎖存器各位為xxx1x1xx,可見指定位為1,其他位保持不變。常用邏輯異或(XRL)指令用于將操作數(shù)中指定位取反,如可通過如下指令將P1口鎖存器的b4、b2位取反,而其他位不變。XRL P1, #00010100B 在構(gòu)造立即數(shù)時,希望取反位為1,其他位為0。 8585左循環(huán)移位(RL)指令常用于實現(xiàn)2n(如2、4、8等)運算。例如,當(dāng)需要對累加器A進(jìn)行乘4操作時,如果A小于3FH,用如下兩條左循環(huán)移位指令完成比用乘法指令速度快、代碼短。RL A;左循環(huán)移位一次,相當(dāng)于乘2RL A;再左循環(huán)移位一次,
54、相當(dāng)于乘4以上兩條指令執(zhí)行時間僅需21個機器周期,代碼長度為21字節(jié),但如果使用乘法指令實現(xiàn),則需要6個機器周期(24),代碼長度為4字節(jié)(31)。MOV B, #04H ;3字節(jié),執(zhí)行時間為2個機器周期MUL AB;1字節(jié),執(zhí)行時間為4個機器周期86863.1.4 位操作指令位操作指令由于單片機在控制系統(tǒng)中主要用于控制線路的通與斷、繼電器的吸合與釋放等,因此位操作指令在單片機指令系統(tǒng)占有重要地位。多數(shù)8位機都保留了一位機的功能,即提供了完整的位尋址功能和位操作指令。MCS-51單片機具有豐富的位操作指令,在位運算指令中,進(jìn)位標(biāo)志位Cy的作用類似于字節(jié)運算指令中的累加器A,因此Cy在位操作指令
55、中被稱為“位累加器”。在MCS-51中,位存儲器包括了內(nèi)部RAM 20H2FH單元的位存儲區(qū)以及特殊功能寄存器中支持位尋址的所有位。8787MCS-51位操作指令操作碼助記符、指令格式以及機器碼等如表3-14所示。在位操作中,位存儲器均使用直接地址。在匯編語言指令中,有關(guān)特殊功能寄存器中位地址的表示方法第2章已介紹過。在位操作中,除了使用位累加器Cy的位操作指令外,其他標(biāo)志位均不受影響。MCS-51沒有提供位異或運算指令,當(dāng)需要位異或運算時,可通過位邏輯與、邏輯或指令得到,因為有。例如,設(shè)X、Y、Z均為位地址變量,則可通過如下指令求X、Y位變量的異或結(jié)果:YXYXYX8888表表3-14 MC
56、S-51位操作指令位操作指令8989MOV C,X;位變量X送CyANL C,/Y ;MOV Z,C;暫存MOV C, Y;位變量Y送CyANL C,/X;ORL C,Z ;MOV Z,C;保存X、Y異或運算結(jié)果YX YXYXC YXYXCYXC 90903.1.5 控制及轉(zhuǎn)移指令控制及轉(zhuǎn)移指令以上介紹的指令均屬于順序執(zhí)行指令,即執(zhí)行了當(dāng)前指令后,接著就執(zhí)行下一條指令。但在計算機中,只有順序執(zhí)行指令是不夠的,更一般的情況是:執(zhí)行了當(dāng)前指令后,往往需要根據(jù)執(zhí)行結(jié)果做出判別,是繼續(xù)執(zhí)行隨后的指令,還是轉(zhuǎn)去執(zhí)行其他的指令系列。這種情況下就要用到控制及轉(zhuǎn)移指令??刂萍稗D(zhuǎn)移指令包括跳轉(zhuǎn)(無條件跳轉(zhuǎn)和條件
57、跳轉(zhuǎn))指令、調(diào)用指令、返回指令以及停機指令等。91911. 無條件跳轉(zhuǎn)指令無條件跳轉(zhuǎn)指令無條件跳轉(zhuǎn)指令是指執(zhí)行了該指令后,程序?qū)o條件跳到指令中給定的存儲器地址單元執(zhí)行。MCS-51無條件跳轉(zhuǎn)指令操作碼助記符、格式以及機器碼等如表3-15所示。9292表表3-15 無條件跳轉(zhuǎn)指令無條件跳轉(zhuǎn)指令9393對表3-15的說明如下: (1) 絕對無條件跳轉(zhuǎn)指令A(yù)JMP只需11位地址,即該指令執(zhí)行后,僅將指令中給定的11位地址裝入程序計數(shù)器PC的低11位,而高5位(即PC15PC11)保持不變。因此,AJMP指令只能實現(xiàn)2KB(由于高5位地址編碼相同,而A10A0的尋址范圍就是2KB)范圍內(nèi)的跳轉(zhuǎn),即轉(zhuǎn)
58、入的存儲單元地址的高5位地址編碼與PC計數(shù)器當(dāng)前值的高5位必須相同,否則會出現(xiàn)跨頁錯誤。假設(shè)“AJMP 267BH”指令存放在2000H單元,由于該指令占用兩個字節(jié),執(zhí)行后,PC2002H,即00100 00000000010B,由于低11位地址由AJMP指令給出,可見跳轉(zhuǎn)目標(biāo)地址范圍在00100 00000000000B00100 11111111111B之間,即2000H27FFH之間。由于“267B”在目標(biāo)地址范圍之內(nèi),因而能夠跳轉(zhuǎn)。9494(2) 長跳轉(zhuǎn)指令給出了16位地址,該地址就是轉(zhuǎn)移后要執(zhí)行的指令碼所在的存儲單元地址。因此,該指令執(zhí)行后,指令中給定的16位地址將裝入程序計數(shù)器PC
59、中。長跳轉(zhuǎn)指令可使程序跳到64KB范圍內(nèi)的任一單元執(zhí)行,常用于跳到主程序及中斷服務(wù)程序的入口處,如:ORG 0000HLJMP Main;其中Main是主程序入口地址標(biāo)號ORG 0003HLJMP INT0;INT0是外中斷0服務(wù)程序入口地址標(biāo)號9595(3) 短跳轉(zhuǎn)指令“SJMP rel”中的rel是一個帶符號的8位地址,范圍在128127之間,當(dāng)偏移量為負(fù)數(shù)(用補碼表示)時,向前跳轉(zhuǎn);而當(dāng)偏移量為正數(shù)時,向后跳轉(zhuǎn)。由于SJMP指令占兩個字節(jié),執(zhí)行該指令后,PCxxxx2 (xxxx是SJMP指令碼的首地址)。當(dāng)rel為FEH,即2時,跳轉(zhuǎn)地址等于PCxxxx22xxxx,即又跳回SJMP指
60、令碼首地址單元,程序?qū)⒉粩嘀貜?fù)執(zhí)行SJMP指令,這相當(dāng)于動態(tài)停機。在匯編語言中,重復(fù)執(zhí)行SJMP指令常寫為: Here:SJMP Here或SJMP $ 9696在匯編語言源程序中,$表示指令的首地址。執(zhí)行這條指令,會使機器進(jìn)入死循環(huán)。如果中斷處于允許狀態(tài),則當(dāng)中斷有效時,將進(jìn)入中斷服務(wù)程序,但從中斷服務(wù)程序返回后又會重復(fù)執(zhí)行SJMP指令。 (4) 在間接跳轉(zhuǎn)“JMP ADPTR”指令中,將DPTR內(nèi)容與累加器A相加,得到的16位地址可作為PC的值。因此,通過該指令可以動態(tài)修改PC。間接跳轉(zhuǎn)指令的跳轉(zhuǎn)地址由累加器A控制,常用作多分支跳轉(zhuǎn)指令。97972. 條件跳轉(zhuǎn)指令條件跳轉(zhuǎn)指令為了提高編程效
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京課改版歷史七年級上冊第11課《秦朝的統(tǒng)一》聽課評課記錄
- 新人教版九年級歷史下冊第19課《現(xiàn)代音樂和電影》聽課評課記錄
- 蘇科版九年級數(shù)學(xué)聽評課記錄:第31講 與圓有關(guān)的位置關(guān)系
- 人教版九年級數(shù)學(xué)下冊:29《復(fù)習(xí)題》聽評課記錄1
- 二年級體育聽評課記錄
- 首師大版道德與法治七年級下冊1.2《彼此尊重顯自尊》聽課評課記錄
- 五年級數(shù)學(xué)下冊聽評課記錄-《6 圓的面積》蘇教版
- 蘇教版小學(xué)數(shù)學(xué)四年級上口算部分
- 三年級語文教學(xué)計劃模板
- 新員工入職工作計劃書
- 人教版小學(xué)數(shù)學(xué)(2024)一年級下冊第五單元100以內(nèi)的筆算加、減法綜合素養(yǎng)測評 B卷(含答案)
- 2024-2025學(xué)年北京市豐臺區(qū)高三語文上學(xué)期期末試卷及答案解析
- 2024年度體育賽事贊助合同:運動員代言與贊助權(quán)益2篇
- 2025屆西藏林芝一中高三第二次診斷性檢測英語試卷含解析
- 藥企銷售總經(jīng)理競聘
- 開封市第一屆職業(yè)技能大賽健康照護(hù)項目技術(shù)文件(國賽)
- 公路電子收費系統(tǒng)安裝合同范本
- 醫(yī)院培訓(xùn)課件:《傷口評估與測量》
- 2021年全國高考物理真題試卷及解析(全國已卷)
- 期末試卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)滬教版
- 《第一單元口語交際:即興發(fā)言》教案-2023-2024學(xué)年六年級下冊語文統(tǒng)編版
評論
0/150
提交評論