第3章,AT89C51單片機(jī),的指令系統(tǒng)_第1頁
第3章,AT89C51單片機(jī),的指令系統(tǒng)_第2頁
第3章,AT89C51單片機(jī),的指令系統(tǒng)_第3頁
第3章,AT89C51單片機(jī),的指令系統(tǒng)_第4頁
第3章,AT89C51單片機(jī),的指令系統(tǒng)_第5頁
已閱讀5頁,還剩120頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

3.1指令系統(tǒng)概述一、基本概念

指令:指揮計算機(jī)(CPU)完成各種操作的基本命令。

指令系統(tǒng):一臺計算機(jī)所有指令的集合。P.30AT89C51的基本指令共111條二、指令格式

指令由兩部分組成,即操作碼和操作數(shù)。

操作碼:規(guī)定指令進(jìn)行什么操作;

操作數(shù):指令操作的對象第3章AT89C51單片機(jī)的指令系統(tǒng)

三、指令系統(tǒng)的分類1、按指令占用的存儲單元字節(jié)數(shù)分類機(jī)器語言目標(biāo)程序

匯編語言源程序注釋04H

INCA

;將A的內(nèi)容加174H30HMOVA,#30H;將數(shù)30H送入A中85H40H50H

MOV50H,40H

;將片內(nèi)RAM40H單元內(nèi)容送入50H單元匯編單字節(jié)指令雙字節(jié)指令三字節(jié)指令(1)單字節(jié)指令:操作碼、操作數(shù)同在一個字節(jié)中。(2)雙字節(jié)指令:操作碼+操作數(shù)。(3)三字節(jié)指令:操作碼+操作數(shù)+操作數(shù)。目標(biāo)程序在存儲器中的存儲形式2000H04H2001H74H2002H30H2003H85H2004H40H2005H50H2006H2007H2008HINCAMOVA,#30HMOV50H,40H地址內(nèi)容地址與內(nèi)容可書寫成十六進(jìn)制,但實(shí)質(zhì)是二進(jìn)制2、按指令的執(zhí)行時間來分:(1)1個機(jī)器周期(12個時鐘振蕩周期)指令64條(2)2個機(jī)器周期(24個時鐘振蕩周期)指令45條(3)只有乘、除兩條指令的執(zhí)行時間為4個機(jī)器周期3.3指令系統(tǒng)的尋址方式操作數(shù)指定了參與運(yùn)算的數(shù)據(jù)或數(shù)據(jù)所在單元的地址。如何得到這個地址稱為尋址方式。

不論何種匯編語言,其助記符都包括操作碼和操作數(shù)兩部分。操作碼指明了本條指令的功能,操作數(shù)代表了指令的操作對象。P.311.寄存器尋址操作數(shù)在指定寄存器(A.Rn(n=0~7).DPTR.AB)中……06H……片內(nèi)數(shù)據(jù)存儲器R7……A06H如:MOVA,R7;將工作寄存器R7中的內(nèi)容送累加器A2.直接尋址操作數(shù)以單元直接地址(direct)的形式給出直接尋址可訪問兩種地址空間:⑴特殊功能寄存器SFR

(符號指令中可用SFR名暫代)

⑵片內(nèi)RAM:00~7FH,共128個字節(jié)單元。如:MOVA,70H

;A←(70H),把片內(nèi)RAM地址是70H的單元的內(nèi)容送入累加器A……66H……片內(nèi)數(shù)據(jù)存儲器70H……A66H訪問片內(nèi)數(shù)據(jù)存儲器邏輯空間A(E0H)70H例1:MOVA,#70H;A←70H,把8bit立即數(shù)70H送入累加器AMOV0E0H,#70H;把8bit立即數(shù)70H送E0H單元(即累加器A、SFRAcc)例2:MOVDPTR,#2FC0H;DPTRDPHDPL2FHC0H2FC0H3.立即尋址指令中直接給出參與運(yùn)算的操作數(shù),立即數(shù)之前加“#”予以標(biāo)識;(這條雖與上一條效果相同但指令不同,)把16bit立即數(shù)2FC0H送地址指針寄存器DPTR

70H4.寄存器間接尋址操作數(shù)地址存放在指定的寄存器中Ri(R0、R1)或數(shù)據(jù)指針DPTR中

。前面加@表示間接尋址??稍L問片內(nèi)RAM或外部數(shù)據(jù)存儲器。實(shí)現(xiàn)間接尋址的地址指針:Ri(R0、R1):尋址對象為片內(nèi)RAM的128個單元;

DPTR:尋址對象為外部數(shù)據(jù)存儲器。如:

MOVR0,#60H

;將(地址)60H送入工作寄存器R0

(R0指向60H單元)

MOVA,@R0

;將以R0內(nèi)容為地址

的片內(nèi)RAM單元的內(nèi)容送到累加器A中……36H片內(nèi)數(shù)據(jù)存儲器……60H…………A60HR0R036H地址指針3.3指令系統(tǒng)的尋址方式

尋址方式就是在指令中提供或指明操作數(shù)的方式。1.寄存器尋址方式:操作數(shù)在指定寄存器(A.Rn(n=0~7).DPTR.AB)中EF

MOVA,R7;將工作寄存器R7中的內(nèi)容送累加器A2.直接尋址方式:操作數(shù)以單元直接地址(direct)的形式給出85

07

E0MOV0E0H,07H;將07H單元的內(nèi)容送E0H單元(E0H單元即累加器A)E5

07

MOVA,07H;(這條雖與上一條效果相同但指令不同,)

直接地址direct:00H~7FH片內(nèi)RAM;

80H…F0HSFR(符號指令中可用SFR名暫代)

3.寄存器間接尋址方式:操作數(shù)單元的地址存放在寄存器Ri(R1或R0)中78

40

MOVR0,#40H;將(地址)40H送入工作寄存器R0

(令R0指向40H單元)F6

MOV@R0,A;將累加器A的內(nèi)容送到以R0內(nèi)容為地址的單元中

第一條令R0中的內(nèi)容為40H,第二條則是把A的內(nèi)容送片內(nèi)RAM中地址為40H的單元中。4.立即尋址方式:在指令中給出操作數(shù)本身,稱立即數(shù),加前綴“#”74

40

MOVA,#40H

;將8位立即數(shù)40H送累加器A

75

40

F8

MOV40H,#0F8H;將8位立即數(shù)F8H送地址為40H的單元

90

A1

8F

MOVDPTR,#0A18FH;將16位立即數(shù)A18FH送地址指針寄存器DPTR

P.31R0所指向的5.變址尋址(以后再介紹)基址寄存器的內(nèi)容與變址寄存器的內(nèi)容的和為可尋址單元的地址。該類尋址方式用于訪問程序存儲器,對查表訪問特別有用。基址寄存器(DPTR或PC):存放基準(zhǔn)地址;變址寄存器(A):存放偏移量;7.位尋址尋址對象:1、內(nèi)部RAM的可位尋址區(qū)-共128位;2、專用寄存器的可尋址位。例1:MOVC,13HCy0例2:MOVA,13H片內(nèi)數(shù)據(jù)存儲器……10110111……20H21H22HD7D6……D00110100013HA01101000位地址字節(jié)地址符號說明在分類介紹指令之前,把描述指令的一些符號意義首先作一簡單的介紹:Rn:當(dāng)前選中的寄存器區(qū)的8個工作寄存器R0~R7之一。Ri:代表R0或R1,用作間接尋址寄存器direct:8位的內(nèi)部數(shù)據(jù)存儲器單元的地址。包括內(nèi)部RAM單元的地址及21個SFR的地址。直接尋址。#data:包含在指令中的8位常數(shù)。即8位立即數(shù)#data16:包含在指令中的16位常數(shù)。即

16位立即數(shù)bit:內(nèi)部RAM或SFR中的位地址。位尋址C(即Cy):進(jìn)位標(biāo)志或進(jìn)位位,或布爾處理機(jī)中的運(yùn)算器。@:間接尋址或變址尋址。如@Ri。(×):×地址單元或寄存器中的內(nèi)容。((×)):以寄存器的內(nèi)容作為地址的存儲單元的內(nèi)容?!杭^左邊的內(nèi)容傳送到箭頭右邊的地址單元。/:位操作數(shù)的前綴。表示對該位操作數(shù)求反。如/bit。以下幾個用于對指令的功能及執(zhí)行過程的解釋$:表示當(dāng)前指令的地址。addr16:16位目的地址。用于LCALL和LJMP指令中。轉(zhuǎn)移范圍是64KB程序存儲器空間。addr11:11位目的地址。用于ACALL和AJMP指令中。轉(zhuǎn)移的目的地址必須與下一條指令的第一字節(jié)在同一個2KB程序存儲器區(qū)地址空間之內(nèi)。rel:8位的帶符號的偏移地址。用于SJMP和所有的條件轉(zhuǎn)移指令中。以下幾個用于控制轉(zhuǎn)移類指令,以后再解釋片內(nèi)數(shù)據(jù)存儲器尋址方式示意圖1FH00H20H3區(qū)2區(qū)1區(qū)0區(qū)2FH位地址:00H~7FH數(shù)據(jù)緩沖區(qū)堆棧區(qū)工作單元7FH30H80HFFH21個SFRA、DPTR、AB可寄存器尋址均可直接尋址可寄存器間接尋址Rn可寄存器尋址可位尋址有些可位尋址片外數(shù)據(jù)存儲器程序存儲器寄存器間接尋址。變址尋址(訪問表格)3.4.1數(shù)據(jù)傳送指令一般格式:

MOV(MOVC、MOVX)目的操作數(shù),源操作數(shù)

除此之外,還有數(shù)據(jù)交換指令和堆棧操作指令。功能:

將源操作數(shù)內(nèi)容送入目的操作數(shù)指定的存儲單元,指令執(zhí)行后,源操作數(shù)內(nèi)容不變,目的操作數(shù)內(nèi)容被修改為源操作數(shù)內(nèi)容。訪問片內(nèi)數(shù)據(jù)存儲器訪問程序存儲器訪問片外數(shù)據(jù)存儲器P.34一、片內(nèi)數(shù)據(jù)存儲器及寄存器的數(shù)據(jù)傳送指令指令圖解dir@RiRn#dataA

操作碼匯編指令操作說明74dataMOVA,#data將立即數(shù)data送入AE8~EFMOVA,Rnn=0~7,將Rn內(nèi)容送入AE5directMOVA,direct將direct單元內(nèi)容送入AE6,E7MOVA,@Rii=0,1;將Ri所指單元內(nèi)容送入AF8~FFMOVRn,A將A的內(nèi)容送入RnA8~AFdirectMOVRn,direct將direct單元內(nèi)容送入Rn78~7FdataMOVRn,#data將立即數(shù)data送入RnF6,F7MOV@Ri,A將A的內(nèi)容送入Ri所指單元A6,A7directMOV@Ri,direct將direct單元內(nèi)容送入Ri所指單元76,77dataMOV@Ri,#data將立即數(shù)data送入Ri所指單元

操作碼匯編指令操作說明F5directMOVdirect,A將A的內(nèi)容送入direct88~8FdirectMOVdirect,Rn將Rn的內(nèi)容送入direct85direct2direct1MOVdirect1,direct2將direct2的內(nèi)容送入direct186,87directMOVdirect,@Ri將Ri所指單元內(nèi)容送入direct75directdataMOVdirect,#data將立即數(shù)data送入direct90dataHdataLMOVDPTR,#data16將立即數(shù)data16送入DPTRTM數(shù)據(jù)傳送類指令(1)

P.47例-B1:已知R0=30H,片內(nèi)數(shù)據(jù)存儲器(30H)=50H,(40H)=60H,執(zhí)行下列各指令后,A中內(nèi)容是多少?

MOVA,R0;MOVA,@R0;MOVA,40H;MOVA,#40H;…………60H30H……50H……R0A40H30HXX片內(nèi)數(shù)據(jù)存儲器30HA=30HR050HA=50H60H40HA=60HA=40H40HX7片內(nèi)數(shù)據(jù)存儲器20HX8X5X1X4X3X2R1A30HBDPLDPHX640H30H10H片內(nèi)數(shù)據(jù)存儲器及寄存器的數(shù)據(jù)傳送指令例-B2:分析執(zhí)行下列程序段后,各相關(guān)存儲單元和寄存器內(nèi)容有何變化? MOVR1,#40H;R1= MOVA,R1;A= MOV30H,A;(30H)=MOV20H,30H;(20H)= MOV@R1,#30H;(40H)= MOV20H,@R1(20H)= MOVB,#10H;B= MOVDPL,20H;DPL=MOVDPH,0F0H;DPH=40H40H40H40H40H40H40H40HR130H30HR130H30H10H30H30H10H10H執(zhí)行后A=40HB=10HR1=40HDPTR=1030H(20H)=30H(30H)=40H(40H)=30H【例3-B2】標(biāo)出各操作數(shù)的尋址方式,各指令的機(jī)器代碼

MOVR1,#40H; MOVACC,R1; MOV30H,A; MOV20H,

0E0H; MOV@R1,#30H; MOV20H,@R1; MOVB,#10H; MOVDPL,20H; MOVDPH,0F0H;寄存器尋址寄存器尋址寄存器尋址寄存器間接尋址寄存器間接尋址直接尋址直接尋址直接尋址直接尋址直接尋址直接尋址直接尋址直接尋址直接尋址直接尋址立即尋址立即尋址立即尋址79

4089

E0F5

3085

E02077

3087

2075

F01085

208285

F083機(jī)器碼字節(jié)數(shù)222322333MOVRn,#dataMOVdirect,RnMOVdirect,AMOVdirect1,direct2MOV@Ri,#dataMOVdirect,@RiMOVdirect,#dataMOVdirect1,direct2MOVdirect1,direct2例-B3寫出各操作數(shù)尋址方式、各指令的機(jī)器代碼及執(zhí)行結(jié)果

MOVA,#40H MOV40H,#0F8H

MOVR0,ACC

MOV30H,@R0

MOVR6,30H寄存器尋址立即尋址直接尋址立即尋址寄存器尋址寄存器尋址直接尋址直接尋址直接尋址寄存器間接尋址機(jī)器碼字節(jié)數(shù)274H40H375H40HF8H2A8HE0H286H30H2AEH30H;A=40H;(40H)=F8H;R0=40H;(30H)=F8H;R6=F8H執(zhí)行上述程序段后A=40H,R0=40H,R6=F8H,(30H)=F8H,(40H)=F8H。作業(yè)一:

P.28--1.2.3.4.6.7.補(bǔ)充

如下程序段,請在指令左邊寫出各機(jī)器指令代碼,在各操作數(shù)下方注明其尋址方式,分析每條指令執(zhí)行后的結(jié)果以及最終A、B、R1、R5、(3AH)、(3BH)等單元的內(nèi)容。

MOVR1,#3AHMOVA,#48H MOV@R1,ACC MOVB,3AH MOV3AH,#5CH MOV3BH,@R1 MOVR5,0F0H MOV@R1,#7DH MOV0E0H,3BHA外部數(shù)據(jù)存儲器程序存儲器

@Ri,A@DPTR,AA,@RiA,@DPTRMOVXMOVCA,@A+PCA,@A+DPTRMOVXMOVC二、片外數(shù)據(jù)傳送指令先送給A片外數(shù)據(jù)傳送指令

特點(diǎn):

只能與A之間進(jìn)行數(shù)據(jù)傳送

只能采用寄存器間接尋址方式操作碼匯編指令操作說明E0MOVXA,@DPTR將DPTR所指的片外數(shù)據(jù)存儲器單元內(nèi)容送入AF0MOVX@DPTR,A將A的內(nèi)容送入DPTR所指的片外數(shù)據(jù)存儲器單元E2,E3MOVXA,@Ri將Ri所指的片外數(shù)據(jù)存儲器單元內(nèi)容送入AF2,F(xiàn)3MOVX@Ri,A將A的內(nèi)容送入Ri所指的片外數(shù)據(jù)存儲器單元例-B4:編程將片外數(shù)據(jù)存儲器2040H單元的內(nèi)容傳送到3000H單元。

ORG1000HMOVDPTR,#2040HMOVXA,@DPTR;MOVDPTR,#3000HMOVX@DPTR,A;LP:SJMPLPDPLDPTRDPHDPTR……A……X1……X22040H3000H片外數(shù)據(jù)存儲器片內(nèi)數(shù)據(jù)存儲器20H40HX130H00HDPTRX12040H單元內(nèi)容送入AA的內(nèi)容送入3000H單元三、查表指令

程序存儲器主要用來存放程序,也可存放表格常數(shù),要取出表格常數(shù)時,可以采用查表指令。特點(diǎn)

只能將表格常數(shù)讀入A中表格常數(shù)采用變址尋址方式操作碼匯編指令操作說明93MOVCA,@A+DPTR將以A+DPTR為地址的程序存儲器單元內(nèi)容送入A83MOVCA,@A+PC將以A+PC為地址的程序存儲器單元內(nèi)容送入A指令執(zhí)行后的值指令功能說明例:已知DPTR=2000H,A=E0H,則執(zhí)行MOVCA,@A+DPTR過程如下圖所示:2000H+E0H=20E0HE0HA20H00HDPTRDPHDPL47H…………93H……ROM2040H20E0HALU程序存儲器47H應(yīng)用例-B5:用查表方法求片內(nèi)數(shù)據(jù)存儲器30H單元內(nèi)容(0~9)的平方值,并存入31H單元。y=x2

分析:假設(shè)先將0~9的平方值連續(xù)存放在程序存儲器2009H開始的單元中。則每個平方值存放的單元地址=表格首地址+自變量自變量即為待求平方值的數(shù)。表格地址內(nèi)容y表首地址自變量x2009H00H

2009H+0200AH01H

2009H+1200BH04H

2009H+2200CH09H

2009H+3………2012H51H

2009H+9ROMDPTRAxy方法1 :(使用MOVCA,@A+DPTR指令)

ORG1FF0H MOVA,30H;取數(shù)(即自變量,作偏移量送A) MOVDPTR,#2009H(或#TAB);表格首址送DPTR

MOVCA,@A+DPTR;查表取平方值 MOV31H,A;存結(jié)果LP:SJMPLP ORG2009HTAB: DB0,1,4,9,16,25 DB36,49,64,81;平方值表格

DB(定義字節(jié)偽指令)

方法2::(使用MOVCA,@A+PC指令)

ORG2000H2000HE530MOVA,30H;取數(shù)2002H2404ADDA,#04H;加差址2004H83MOVCA,@A+PC

;查表2005HF531NPC:MOV31H,A;存結(jié)果2007H80FELP:SJMPLP2009H00TAB:DB0,1,4,9,16,25200AH01DB36,49,64,81;平方值表

差址=TAB-NPC=2009H-2005H=04HALU04H20H05H0若使用查表指令MOVCA,@A+PC

;A←((A)+(PC))指令執(zhí)行前(A)=0+4,(PC)=2004HPC取指執(zhí)行2005+4=2009HAPCPC指令執(zhí)行后的值200483H……ROM……002009200501200A04200B…………表格圖解

……

……2004H832005H(NPC)F52006H312007H802008HFE2009H(TAB)00200AH01200BH04200CH09…………MOVCA,@A+PCNPC:MOV31H,ALP:SJMPLPTAB:DB0,1,4,9,16,25DB36,49,64,81該條指令執(zhí)行后的值PC表頭差址差址=表頭地址—PC=TAB—NPC=4ADDA,#04H;加差址ORG2000HMOVA,30H;取數(shù)方法2也可寫成:

ORG2000HMOVA,30H;取數(shù)

ADDA,#TAB—NPC;加差址MOVCA,@A+PC;查表NPC:MOV31H,A;存結(jié)果LP:SJMPLPTAB:DB0,1,4,9,16,25DB36,49,64,81;平方值表【思考】指出下列非法指令違背了什么樣的概念或規(guī)則?1.MOV@R3,A2.MOVDPTR,A3.MOV#2AH,A4.MOVA,@DPTR5.MOVDPTR,10H6.MOV40H,DPTR7.MOVX40H,#30H8.MOVX201AH,A9.MOV201AH,A10.MOV@R0,R411.MOVA,@DPTR12.MOVDPTR,R1MOVX@DPTR,R114.PUSHA15.POPR216.PUSH@R1四、交換指令數(shù)據(jù)交換指令圖解XCHD7~D0D7~D0XCHDD7~D0SWAPdir@RiRnA字節(jié)交換低4位交換高4位、低4位交換交換指令操作碼匯編指令操作說明C8~CFXCHA,Rn將Rn內(nèi)容與A中內(nèi)容全交換C5directXCHA,direct將direct中內(nèi)容與A中內(nèi)容全交換C6,C7XCHA,@Ri將Ri所指單元內(nèi)容與A中內(nèi)容全交換D6,D7XCHDA,@Ri將Ri所指單元內(nèi)容低4位與A中內(nèi)容低4位交換C4SWAPAA中內(nèi)容高4位與低4位交換例:已知A=34H,R1=50H,片內(nèi)數(shù)據(jù)存儲器(50H)=56H,分析執(zhí)行下列指令的結(jié)果。

XCHA,R1;A=,R1=XCHA,@R1;A=,(50H)=XCHDA,@R1;A=,(50H)=SWAPA;A=50H34H56H34H36H54H43H不影響標(biāo)志位CACOV

3.4.2算術(shù)運(yùn)算類指令

積>FF則0V=1B=0則0V=1不影響ACOV標(biāo)志結(jié)果存累加器A

CyCyTM特點(diǎn):一般會影響標(biāo)志寄存器PSW的狀態(tài)3.程序狀態(tài)字寄存器PSW(標(biāo)志寄存器)記存CPU執(zhí)行算術(shù)運(yùn)算及某些操作的一些特征標(biāo)志信息,以備后用SFR名+位次:PSW.7PSW.6PSW.5PSW.4PSW.3PSW.2PSW.1PSW.0

字節(jié)地址+位次:0D0H.70D0H.60D0H.50D0H.40D0H.30D0H.20D0H.10D0H.0位地址:D7HD6HD5HD4HD3HD2HD1HD0HSFR名字節(jié)地址位名稱進(jìn)位標(biāo)志位輔助進(jìn)位標(biāo)志位溢出標(biāo)志位奇偶標(biāo)志位用戶標(biāo)志位工作寄存器區(qū)選擇控制位加減運(yùn)算時最高位向上有進(jìn)/借位則置‘1’加減運(yùn)算時D3位向D4位有進(jìn)/借位則置‘1’BCD數(shù)運(yùn)算修正用加減運(yùn)算時D7、D6位向上的進(jìn)/借位不同則置‘1’補(bǔ)碼運(yùn)算時表征溢出A中‘1’的個數(shù)為奇則置‘1’表征8位碼的奇偶性P.14圖2-3PSW的格式半進(jìn)位標(biāo)志位隨時根據(jù)A的內(nèi)容變化生成位次dir@RiRn#dataA一、加法指令1、加法指令

操作碼匯編指令操作說明24dataADDA,#data立即數(shù)data與A中內(nèi)容相加,結(jié)果存入A,影響PSW位狀態(tài)。25directADDA,directDirect單元內(nèi)容與A中內(nèi)容相加,結(jié)果存入A,影響PSW位狀態(tài)。28~2FADDA,RnRn內(nèi)容與A中內(nèi)容相加,結(jié)果存入A,影響PSW位狀態(tài)。26,27ADDA,@RiRi所指單元內(nèi)容與A中內(nèi)容相加,結(jié)果存入A,影響PSW位狀態(tài)。例:A(A)+((Ri))【例3-1】

(A)=53H,(R0)=FCH,執(zhí)行指令

ADDA,R001010011+)11111100

101001111Cy=1,Ac=0,P=1(A中“1”的位數(shù)為奇數(shù))OV=0(位6和位7同時有進(jìn)位),結(jié)果:(A)=4FH,【例3-2】

(A)=85H,(R0)=20H,(20H)=AFH,執(zhí)行指令:

ADDA,@R0

10000101+)10101111

100110100結(jié)果:(A)=34H,Cy=1,Ac=1,OV=1(位7有進(jìn)位,而位6無進(jìn)位),P=1P.382、帶進(jìn)位加法指令帶進(jìn)位加法指令常用于多字節(jié)數(shù)相加。操作碼匯編指令操作說明34dataADDCA,#data立即數(shù)data與A中內(nèi)容帶進(jìn)位相加,結(jié)果存入A,影響PSW位狀態(tài)。35directADDCA,directDirect單元內(nèi)容與A中內(nèi)容帶進(jìn)位相加,結(jié)果存入A,影響PSW位狀態(tài)。38~3FADDCA,RnRn內(nèi)容與A中內(nèi)容帶進(jìn)位相加,結(jié)果存入A,影響PSW位狀態(tài)。36,37ADDCA,@RiRi所指單元內(nèi)容與A中內(nèi)容帶進(jìn)位相加,結(jié)果存入A,影響PSW位狀態(tài)。指令執(zhí)行前狀態(tài)A(A)+((Ri))+Cy【例3-3】

(A)=85H,(20H)=FFH,Cy=1,執(zhí)行指令:

ADDCA,20H10000101+)11111111

P.38執(zhí)行前Cy:

1110000101(A)=85H,Cy=1,Ac=1,OV=0,P=1結(jié)果為:例-B6片內(nèi)RAM30H,31H和40H,41H分別存放一個兩字節(jié)無符號數(shù),編程將兩數(shù)相加,并將結(jié)果存入30H開始的單元。ORG1000HMOVA,30H;取第一數(shù)低字節(jié) ADDA,40H;加上第二數(shù)低字節(jié) MOV30H,A;存結(jié)果低字節(jié) MOVA,31H;取第一數(shù)高字節(jié) ADDCA,41H;加上第二數(shù)高字節(jié)MOV31H,A及低字節(jié)進(jìn)位

MOVA,#0 ADDCA,#0;高字節(jié)相加的進(jìn)位 MOV32H,A SJMP$(31H)(30H)第一數(shù)高字節(jié)低字節(jié)+(41H)(40H)第二數(shù)(32H)(31H)(30H)結(jié)果3、帶借位減法指令操作碼匯編指令操作說明94DataSUBBA,#dataA中內(nèi)容與立即數(shù)data帶借位相減,結(jié)果存入A,影響PSW位狀態(tài)。95directSUBBA,directA中內(nèi)容與Direct單元內(nèi)容帶借位相減,結(jié)果存入A,影響PSW位狀態(tài)。98~9FSUBBA,RnA中內(nèi)容與Rn內(nèi)容帶借位相減,結(jié)果存入A,影響PSW位狀態(tài)。96,97SUBBA,@RiA中內(nèi)容與Ri所指單元內(nèi)容帶借位相減,結(jié)果存入A,影響PSW位狀態(tài)。A(A)-((Ri))-Cy指令執(zhí)行前狀態(tài)【例3-5】(A)=C9H,(R2)=54H,Cy=1,執(zhí)行指令

SUBBA,R2

11001001—)01010100—)

011101001執(zhí)行前Cy(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位而位7無向上借位),P=0結(jié)果為:4、加1減1指令

加1指令僅操作數(shù)為A時會影響P標(biāo)志,對其他標(biāo)志均無影響。操作碼匯編指令操作說明04INCAA中內(nèi)容加108~0FINCRnRn中內(nèi)容加106,07INC@RiRi所指單元內(nèi)容加105directINCdirectdirect單元內(nèi)容加1A3INCDPTRDPTR內(nèi)容加15、減1指令

減1指令僅操作數(shù)為A時會影響P標(biāo)志,對其他標(biāo)志均無影響。操作碼匯編指令操作說明14DECAA中內(nèi)容減118~1FDECRnRn中內(nèi)容減116,17DEC@RiRi所指單元內(nèi)容減115directDECdirectdirect單元內(nèi)容減1【例3-6】

(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,執(zhí)行指令

DEC A ;(A)-1→A=0EH DEC R7 ;(R7)-1→R7=18H DEC 30H ;(30H)-1→30H=FFH DEC @R1 ;((R1))-1→(R1)=FEH

結(jié)果為

(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,P=1,不影響其他標(biāo)志6、乘除指令操作碼匯編指令操作說明A4MULABBA(A)×(B)若乘積大于FFH,則OV=1,否則OV=0;Cy=0;影響P。84DIVABA、B中兩無符號整數(shù)相除(A/B),結(jié)果商存入A,余數(shù)存入B。當(dāng)除數(shù)B=0時,OV=1,否則OV=0;Cy=0;影響P結(jié)果低8位結(jié)果高8位【例3-7】(A)=FBH,(B)=12H,執(zhí)行指令

DIV AB

結(jié)果為

(A)=0DH,(B)=11H,Cy=0,OV=0。7、十進(jìn)制調(diào)整指令例(1)(2) 00110101BCD35

+)

01000001BCD41

01110110BCD7601010110BCD56+)01111000BCD7811001110??????非BCD碼,必須進(jìn)行調(diào)整。十進(jìn)制調(diào)整指令十進(jìn)制調(diào)整規(guī)則若結(jié)果低4位大于9或Ac=1,則補(bǔ)加06H調(diào)整。若結(jié)果高4位大于9或Cy=1,則補(bǔ)加60H調(diào)整。若結(jié)果高4位等于9且低4位大于9,則補(bǔ)加66H調(diào)整。例:01011001BCD59+)01111000BCD7811010001??????非BCD碼

+)低4位Ac=1高4位大于901100110100110111BCD137判斷調(diào)整過程由十進(jìn)制調(diào)整指令DAA自動完成十進(jìn)制調(diào)整指令

注意:

DAA指令僅對BCD碼加法運(yùn)算結(jié)果進(jìn)行調(diào)整。使用時緊跟ADD(ADDC)指令之后。操作碼匯編指令操作說明D4DAA十進(jìn)制調(diào)整,對BCD碼十進(jìn)制加法運(yùn)算結(jié)果調(diào)整對標(biāo)志位的影響:調(diào)整過程中,若高位產(chǎn)生進(jìn)位,則Cy=1,若無進(jìn)位,Cy保持原狀態(tài)。OV、Ac不受影響。ADDA,R5

;A=BDH,Cy=0,Ac=0,OV=1,P=0

DAA

;Cy=1,A=23H,Ac=0,OV=1,P=1第一條指令按二進(jìn)制加與上一條指令執(zhí)行后的狀態(tài)一致A=23H=00100011B奇數(shù)個“1”結(jié)果:Cy=1,A=23H,(應(yīng)看作BCD碼123H,代表十進(jìn)制數(shù)123,與56+67=123一致,正確)Ac=0,OV=1,P=1【例3-4】

(A)=56H,(R5)=67H,把它們看作為兩個壓縮的BCD數(shù),進(jìn)行BCD數(shù)的加法。執(zhí)行指令:例-B7:片內(nèi)RAM30H,31H和40H,41H分別存放一個兩字節(jié)無符號BCD數(shù),編程將兩數(shù)相加,并將結(jié)果存入30H開始的單元。ORG1000HMOVA,30H;取第一數(shù)低字節(jié)ADDA,40H;加上第二數(shù)低字節(jié)

DAA;十進(jìn)制調(diào)整MOV30H,A;存結(jié)果低字節(jié)MOVA,31H;取第一數(shù)高字ADDCA,41H;加上第二數(shù)高字節(jié)

DAA

;十進(jìn)制調(diào)整MOV31H,A及低字節(jié)進(jìn)位

MOVA,#0ADDCA,#0;高字節(jié)相加的進(jìn)位;無需進(jìn)行十進(jìn)制調(diào)整(其結(jié)果為00H或01H)

MOV32H,ASJMP$【練習(xí)】如果是雙字節(jié)數(shù)相加結(jié)果只需雙字節(jié)呢?如果是雙字節(jié)二進(jìn)制數(shù)相加(不是BCD數(shù))呢?如果是雙字節(jié)二進(jìn)制數(shù)相減結(jié)果為雙字節(jié)二進(jìn)制數(shù)呢?如果是單字節(jié)二進(jìn)制數(shù)相加結(jié)果為雙字節(jié)呢?如果是(31H)、(30H)的雙字節(jié)數(shù)加上(41H)、(40H)中的雙字節(jié)數(shù),三字節(jié)結(jié)果存放于(52H)、(51H)、(50H)中,前者為高字節(jié),如何編程。dir@RiRnA算術(shù)運(yùn)算指令圖解BDPTR#DATAADDADDADDADDADDCADDCADDCADDCSUBBSUBBSUBBSUBBDAINCINCINCINCINCDECDECDECDECMULDIV3.4.3邏輯操作類指令跟‘0’相與的位被屏蔽(清0)跟‘1’相或的位被置1跟‘1’相異或的位被求反TM一、邏輯“與”運(yùn)算指令操作碼匯編指令操作說明54dataANLA,#datadata與A內(nèi)容相“與”,結(jié)果存入A55directANLA,directdirect內(nèi)容與A內(nèi)容相“與”,結(jié)果存入A58~5FANLA,RnRn內(nèi)容與A內(nèi)容相“與”,結(jié)果存入A56,57ANLA,@RiRi所指單元內(nèi)容與A內(nèi)容相“與”,結(jié)果存入A52directANLdirect,Adirect內(nèi)容與A內(nèi)容相“與”,結(jié)果存入direct53directdataANLdirect,#datadata與direct內(nèi)容相“與”,結(jié)果存入direct二進(jìn)制數(shù)的邏輯與運(yùn)算

0^0=01^0=00^1=01^1=1

例:

邏輯與運(yùn)算常用來將一個數(shù)據(jù)的某些位清零(屏蔽),而保持其他位不變。

例-B8:將30H單元的高4位清零,低4位保持不變,可用下面指令實(shí)現(xiàn)。

ANL30H,#0FH(#00001111B)10110011B^)

01111101B

0011

0001B和0相與和1相與【例3-9

】(A)=07H,(R0)=0FDH,執(zhí)行指令:

ANLA,R0

結(jié)果:(A)=05H二、邏輯“或”運(yùn)算指令操作碼匯編指令操作說明44dataORLA,#datadata與A內(nèi)容相“或”,結(jié)果存入A45directORLA,directdirect內(nèi)容與A內(nèi)容相“或”,結(jié)果存入A48~4FORLA,RnRn內(nèi)容與A內(nèi)容相“或”,結(jié)果存入A46,47ORLA,@RiRi所指單元內(nèi)容與A內(nèi)容相“或”,結(jié)果存入A42directORLdirect,Adirect內(nèi)容與A內(nèi)容相“或”,結(jié)果存入direct43directdataORLdirect,#datadata與direct內(nèi)容相“或”,結(jié)果存入direct二進(jìn)制數(shù)的邏輯或運(yùn)算

0v0=01v0=10v1=11v1=1

例:

邏輯或運(yùn)算常用來將一個數(shù)據(jù)的某些位置1,而保持其他位不變。

例-B9:將30H單元的低4位置1,高4位保持不變,可用下面指令實(shí)現(xiàn)。

ORL30H,#0FH(#00001111B)

10100001Bv)01101101B

11101101B和1相或和0相或【例3-10】

(P1)=05H,(A)=33H,執(zhí)行指令

ORLP1,A

結(jié)果:(P1)=37H三、邏輯“異或”運(yùn)算指令操作碼匯編指令操作說明64dataXRLA,#datadata與A內(nèi)容“異或”,結(jié)果存入A65directXRLA,directdirect內(nèi)容與A內(nèi)容“異或”,結(jié)果存入A68~6FXRLA,RnRn內(nèi)容與A內(nèi)容“異或”,結(jié)果存入A66,67XRLA,@RiRi所指單元內(nèi)容與A內(nèi)容“異或”,結(jié)果存入A62directXRLdirect,Adirect內(nèi)容與A內(nèi)容“異或”,結(jié)果存入direct63directdataXRLdirect,#datadata與direct內(nèi)容“異或”,結(jié)果存入direct

二進(jìn)制數(shù)的邏輯異或運(yùn)算

0

0=01

0=10

1=11

1=0

例:

邏輯異或運(yùn)算常用來將一個數(shù)據(jù)的某些位取反,而保持其他位不變。

例-B10:將A的奇數(shù)位取反而偶數(shù)位保持不變,可用下面指令實(shí)現(xiàn)。 XRLA,#0AAH(XRLA,#10101010B)

10100001B

)01101101B11001100B和1相異或和0相異或【例3-11】(A)=90H,(R3)=73H執(zhí)行指令:

XRLA,R3結(jié)果:(A)=E3H四、累加器清零、取反指令操作碼匯編指令操作說明F4CPLAA中內(nèi)容按位取反E4CLRAA中內(nèi)容清零累加器清零、取反指令例:將累加器A的內(nèi)容取反。(1)CPLA(2)XRLA,#0FFH例:將累加器A清零。(1)CLRA(2)ANLA,#0(3)MOVA,#0五、循環(huán)移位指令操作碼匯編指令操作說明23RLAA中內(nèi)容循環(huán)左移一位,D7移入D003RRAA中內(nèi)容循環(huán)右移一位,D0移入D733RLCAA中內(nèi)容帶進(jìn)位位循環(huán)左移一位,D7移入C,C移入D013RRCAA中內(nèi)容帶進(jìn)位位循環(huán)右移一位,D0移入C,C移入D7RLCA操作示意:CyD7D6D5D4D3D2D1D0RLA操作示意:D7D6D5D4D3D2D1D0邏輯運(yùn)算指令圖解dir@RiRnA#DATAANLANLANLANLORLORLORLORLXRLXRLXRLXRLRLANLORLXRLRLCRRRRCCLRCPL

邏輯運(yùn)算指令只有目的操作數(shù)為A時會影響P,

對其他標(biāo)志無影響?!纠鼴3-11】8位二進(jìn)制碼算術(shù)左移(無符號數(shù)乘2):

CLRC;Cy清0RLCA;左移1位,低位補(bǔ)0,原最高位進(jìn)到Cy中

【例B3-12】8位二進(jìn)制碼邏輯右移(無符號數(shù)除2):

CLRC ;Cy清0RRCA;右移1位,高位補(bǔ)0,原最低位移到Cy中

【思考】DPTR(DPH、DPL)中的16位二進(jìn)制碼算術(shù)左移(乘2)【思考】DPTR(DPH、DPL)中的16位二進(jìn)制碼邏輯右移(除2)【思考】指出下列非法指令違背了什么樣的概念或規(guī)則?ADD20H,#10HINC@R5DECDPTRADDC

#30H,ARLCADEC#60HANL4AH,R0ORLR0,#8AH作業(yè)二:

P.51—7、8、9、10、15、16

補(bǔ)充:請分析下列程序段執(zhí)行后有關(guān)單元的內(nèi)容。

MOVA,#68H MOVR0,#40H PUSHACC ADDA,#50H MOV@R0,A MOVA,R0 INCR0 MOV@R0,A POPB ORLA,40H答:A=F8H,R0=41H,B=68H,(40H)=B8H,(41H)=40HANLA,R5R3單條指令實(shí)現(xiàn)3.4.5位操作指令位傳送位清0位求反位置位位邏輯與位邏輯或bit:位直接地址(00H~7FH、80h…F7H),位直接尋址方式C:位累加器,位寄存器尋址方式P.45

20H.6ByteTM1、位傳送指令 MOVC,bit;將位地址bit的內(nèi)容送入C MOVbit,C;將C的內(nèi)容送入bit位 例:已知片內(nèi)RAM(20H)=05H執(zhí)行 MOVC,00H MOV07H,C

位地址=00000101B,;Cy=(00H)bit=(20H.0)=1;(07H)bit=(20H.7)=1之后:片內(nèi)RAM20H單元的D7位變?yōu)?(20H)=10000101B=85H12.位修改指令

位清0指令

CLRC;將Cy清0 CLRbit;將bit位清0

位取反指令

CPLC CPLbit

位置1指令

SETBC SETBbit【例3-13】

CLRC ;0→Cy

CLR27H ;0→24H.7位

CPL08H

;21H.0求反→21H.0位

SETBP1.7 ;1→P1.7位24H.721H.097H或90H.7P.45【例3-12】

MOVC,

06H

;20H.6→Cy

MOVP1.0,C

;Cy→P1.090H或90H.03.位邏輯運(yùn)算指令

ANLC,bit ANLC,/bit

ORLC,bit ORLC,/bit

例-補(bǔ)充利用位邏輯指令,模擬下圖所示硬件邏輯電路功能。參考子程序如下:

PR2:MOVC,P1.1;Cy←(P1.1)ORLC,P1.2;Cy←(P1.1)∨(P1.2)ANLC,P1.0;Cy←A∧(P1.0)CPLC;Cy←MOVF0,C;B點(diǎn)邏輯值暫存于F0(F0即PSW.5位)MOVC,P1.3;Cy←(P1.3)ANLC,/P1.4;Cy←(P1.3)∧ORLC,F0;Cy←D∨BMOVP1.5,C;運(yùn)算結(jié)果輸出到P1.5端

RET硬件邏輯電路圖=A點(diǎn)邏輯=B點(diǎn)邏輯=D點(diǎn)邏輯【例B3-14】如下控制梯形圖,請用MCS-51程序?qū)崿F(xiàn):

MOVC,P1.3;取P1.3ANLC,P1.2;串聯(lián)P1.2ORLC,P2.1;并聯(lián)P2.1ANLC,/P2.0;串聯(lián)P2.0常閉點(diǎn)MOVP2.0,C;輸出P2.0輸入開關(guān)量輸出驅(qū)動請與可編程邏輯控制器的梯形圖程序相比較,各自的實(shí)現(xiàn)原理與特點(diǎn)?LD

OUT

3.4.4控制轉(zhuǎn)移指令

控制轉(zhuǎn)移指令的功能就是改變程序計數(shù)器PC的內(nèi)容,控制程序從原順序執(zhí)行地址轉(zhuǎn)移到目標(biāo)地址處繼續(xù)執(zhí)行。

PC:16位可預(yù)置加1計數(shù)器每取一個字節(jié)指令代碼,自動加1執(zhí)行跳轉(zhuǎn)指令時將目標(biāo)地址置入PCPC(程序計數(shù)器,程序指針):始終存放著下一條CPU要取出執(zhí)行的指令在程序存儲器中的地址。始終指向要取出執(zhí)行的下一條指令代碼存放單元,控制轉(zhuǎn)移指令有無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令。P.673.4.4控制轉(zhuǎn)移類指令指令助記符中只需寫目標(biāo)指令前的標(biāo)號

P.43(POPPC)無條件轉(zhuǎn)移條件轉(zhuǎn)移比較轉(zhuǎn)移循環(huán)控制相減但不存差值,生成了Cy減1后回存再判00H否執(zhí)行相對轉(zhuǎn)移:PC←PC+rel;∴rel=[目標(biāo)地址-下一指令址]低8位

目標(biāo)地址下一指令址+偏移量A=00H時轉(zhuǎn)移A≠00H時轉(zhuǎn)移ByteTM兼容于MCS-4864K范圍內(nèi)一、無條件轉(zhuǎn)移指令

1、長轉(zhuǎn)移指令 LJMPaddr163字節(jié);PCaddr16

功能:將addr16送入PC,在執(zhí)行完該條指令后,程序轉(zhuǎn)移到addr16處繼續(xù)執(zhí)行。

例:……

LJMPNEXT……

NEXT:…… 轉(zhuǎn)移的目標(biāo)地址一般用標(biāo)號表示轉(zhuǎn)移的目標(biāo)地址轉(zhuǎn)移范圍不受限制。P.442、相對轉(zhuǎn)移指令SJMPrel2字節(jié);PCPC+2+rel

轉(zhuǎn)移的目標(biāo)地址當(dāng)前指令地址下一條指令地址偏移量rel=[目標(biāo)地址—下一條指令地址]低8位rel是8位帶符號數(shù),轉(zhuǎn)移范圍為-128~+127。

在程序中,rel用目標(biāo)地址標(biāo)號表示。例:SJMPNEXT……NEXT:

指令LOOP:SJMPLOOP

也可寫成SJMP$

3、短轉(zhuǎn)移指令(了解)AJMPaddr112字節(jié);PC10~0

addr11PC15~11不變轉(zhuǎn)移的目標(biāo)地址應(yīng)與該轉(zhuǎn)移指令的下一條指令地址的高5位一致,2K范圍內(nèi)轉(zhuǎn)移。4、間接長轉(zhuǎn)移指令(散轉(zhuǎn)指令,了解)JMP@A+DPTR

例:編程實(shí)現(xiàn),根據(jù)片內(nèi)RAM30H單元內(nèi)容(0~9)轉(zhuǎn)移至入口地址為OPR0~OPR

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論