第3章指令系統(tǒng)培訓(xùn)講學(xué)_第1頁
第3章指令系統(tǒng)培訓(xùn)講學(xué)_第2頁
第3章指令系統(tǒng)培訓(xùn)講學(xué)_第3頁
第3章指令系統(tǒng)培訓(xùn)講學(xué)_第4頁
第3章指令系統(tǒng)培訓(xùn)講學(xué)_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章指令系統(tǒng)1.掌握指令格式和尋址方式2.理解每條指令的含義3.熟練運(yùn)用每條指令編寫程序4.掌握匯編語言程序編譯環(huán)境本章學(xué)習(xí)要求:單片機(jī)原理及應(yīng)用3.1AT89C51程序設(shè)計語言介紹3.1AT89C51程序設(shè)計語言介紹機(jī)器語言:用二進(jìn)制代碼表示的指令,也是CPU唯一能夠接受的指令形式.如:MOVA,R0;機(jī)器語言(機(jī)器碼)為:1110_1000bMOVR1,A;機(jī)器碼為:1111_1001b匯編語言:

匯編語言就是用助字符表示的指令,與機(jī)器語言指令一一對應(yīng)。 如:兩個寄存器相加匯編語言指令:ADDA,R0C51語言:

語法同標(biāo)準(zhǔn)C語言。開發(fā)效率高,可讀性強(qiáng),是目前使用最為廣泛的單片機(jī)開發(fā)語言。一條C語言通常需要由多條機(jī)器語言組成。

機(jī)器語言(MachineLanguage)有三類匯編語言

(Assemble)

高級語言

(HighLevelLanguage)3.2指令格式和尋址方式3.2指令格式和尋址方式3.2.1匯編語言指令格式:[標(biāo)號:]操作碼操作數(shù)1,操作數(shù)2[;注釋]

例如:LOOP:MOVA,#40H ;取參數(shù)

1.標(biāo)號:指令的符號地址。2.操作碼:指明指令功能。3.操作數(shù):指令操作對象。

數(shù)據(jù)、地址、寄存器名及約定符號。

操作數(shù)1:目的操作數(shù);操作數(shù)2:源操作數(shù).4.注釋行:說明指令在程序中的作用。操作碼和操作數(shù)是指令主體。換行表示一條指令結(jié)束。3.2指令格式和尋址方式3.2.2機(jī)器語言指令格式:內(nèi)部數(shù)據(jù)存儲器開辟的工作寄存器區(qū)可以減小程序長度、提高程序運(yùn)行速度、簡化程序設(shè)計。舉例: 匯編語言: 機(jī)器語言: MOVA,R0 E8H11 MOVA,30H E530H21 MOVR6,#32H 7E32H21 MOV40H,#64H 754064H32011101010100000001100100字節(jié)數(shù)機(jī)器周期數(shù) 操作碼[操作數(shù)1][操作數(shù)2]

有單字節(jié)、雙字節(jié)和三字節(jié)指令。3.2指令格式和尋址方式3.2.3指令尋址方式一.操作數(shù)類型:位(bit)─位尋址區(qū)中的一位二進(jìn)制數(shù)據(jù)字節(jié)(Byte)─8位二進(jìn)制數(shù)據(jù)字(Word)─16位雙字節(jié)數(shù)據(jù)二.七種尋址方式:(1)立即尋址方式:

指令中給出實(shí)際操作數(shù)據(jù)(立即數(shù)),用于寄存器或存儲器賦常數(shù)初值。舉例:8位立即數(shù):MOVA,#40H ;A?#40H16位立即數(shù):MOVDPTR,#2100H;DPTR?#2100H★思考題:什么是立即數(shù)?3.2指令格式和尋址方式(2)直接尋址方式:操作數(shù)是存儲器單元地址,數(shù)據(jù)放在存儲器單元中。

MOVA,40H

;A?(40H),注意小括弧的含義直接尋址方式對數(shù)據(jù)操作時,地址是固定值,而地址所指定的單元內(nèi)容為變量形式。41H

78H40H

56H

例:設(shè)存儲器兩個單元的內(nèi)容如圖所示,執(zhí)行指令MOVA,40H后(A)=?思考題:★直接尋址方式指令和立即尋址方式指令的形式有什么不同?56H3.2指令格式和尋址方式(3)寄存器尋址方式:(4)寄存器間接尋址方式:

操作數(shù)為寄存器名,寄存器中存放的是數(shù)據(jù)地址。存放地址的寄存器稱為間址寄存器或數(shù)據(jù)指針。例: MOVA,@R0 ;A?((R0))設(shè)指令執(zhí)行前A=20H,R0=40H,地址為40H存儲器單元內(nèi)容如圖所示。執(zhí)行指令后,A=?,R0=?,(40H)=?34H40H34H01000000AR000100000

41H 67H

40H

34HR0→A20HR040H例:MOVA,R0 ;A?(R0)設(shè)指令執(zhí)行前(A)=20H,(R0)=40H,執(zhí)行指令后,(A)=?,(R0)=?操作數(shù)為寄存器名,數(shù)據(jù)存放在寄存器中。40H40H3.2指令格式和尋址方式(5)變址間接尋址方式:

例: MOVCA,@A+DPTR ;A?((A)+(DPTR))設(shè)指令執(zhí)行前(A)=09H,(DPTR)=2000H,存儲器單元內(nèi)容如圖所示。執(zhí)行指令后,(A)=?(DPTR)=?12H2000H2008H 89H2009H

12H

數(shù)據(jù)在存儲器中,指令給出的寄存器中為數(shù)據(jù)的基地址和偏移量。數(shù)據(jù)地址=基地址+偏移量。

說明:1、只對程序存儲器;

2、指令形式:MOVCA,@A+DPTR

MOVCA,@A+PC

3.2指令格式和尋址方式指令給出位地址。一位數(shù)據(jù)在存儲器位尋址區(qū)。(1)內(nèi)部RAM中的位尋址區(qū):字節(jié)地址為20H~2FH;(2)專用寄存器的可尋址位.表示方法:1)直接使用位地址;如:PSW的位6可表示為0D6H2)位名稱表示;或AC3)字節(jié)地址加位數(shù)表示;或D0H.64)專用寄存器符號加位數(shù)表示?;騊SW.6例:MOVC,40H ;Cy?(位地址40H)設(shè)指令執(zhí)行前Cy=1,位地址40H存儲器單元如圖,執(zhí)行指令后,Cy=?29H

0110001028H

11010110位尋址區(qū)0(6)位尋址方式:3.2指令格式和尋址方式(7)相對尋址方式:主要用于相對跳轉(zhuǎn)指令。目的地址=轉(zhuǎn)移指令地址+rel(偏移量)當(dāng)前PC值加上指令中規(guī)定的偏移量rel,構(gòu)成實(shí)際的操作數(shù)地址例:SJMPrel操作:跳轉(zhuǎn)到的目的地址=當(dāng)前16位PC值+rel注意:符號“rel”表示“偏移量”,是一個帶符號的單字節(jié)數(shù),范圍是:-128~+127(80H~7FH)。在實(shí)際編程中,“rel”通常用標(biāo)號代替。不需要手工計算3.2.4指令執(zhí)行過程3.2指令格式和尋址方式例:MOVA,30H1.PC直針按照當(dāng)前指令字節(jié)數(shù)遞增,指向下一條指令;2.執(zhí)行指令主體功能,將30H單元內(nèi)數(shù)據(jù)傳送到A;3.修改PSW中的相關(guān)標(biāo)志位,本例中涉及校驗(yàn)位P。3.3指令分類介紹3.3指令分類介紹指令按功能分類:數(shù)據(jù)傳送、算術(shù)運(yùn)算、邏輯運(yùn)算、布爾處理、程序控制。實(shí)現(xiàn)寄存器、存儲器之間的數(shù)據(jù)傳送。一、內(nèi)部傳送指令: 片內(nèi)數(shù)據(jù)存儲器數(shù)據(jù)傳送。二、外部傳送指令: 片外數(shù)據(jù)存儲器數(shù)據(jù)傳送。三、查表指令: 程序存儲器數(shù)據(jù)傳送。四、交換指令: 片內(nèi)數(shù)據(jù)存儲器數(shù)據(jù)傳送。五、堆棧操作指令: 片內(nèi)數(shù)據(jù)存儲器數(shù)據(jù)傳送。3.3.1數(shù)據(jù)傳送指令3.3指令分類介紹一內(nèi)部傳送指令:(MOV)指令機(jī)器碼:11101rrrE8~EF11100101nE5

n1110011iE6、E701110100d74d10101rrrn 1010011in85n1n2

90d1d2MOVA,Rn ;A←(Rn),n=0~7MOVA,direct ;A←(direct)MOVA,@Ri ;A←((Ri)),i=0、1

MOVA,#data ;A←data

MOVRn,direct ;Rn←(direct)

MOV@Ri,direct ;(Ri)←(direct)MOVdirect1,direct2

;direct1←(direct2)

MOVDPTR,#data16;DPTR←data16實(shí)現(xiàn)片內(nèi)數(shù)據(jù)存儲器中數(shù)據(jù)傳送。指令格式:MOV目的操作數(shù),源操作數(shù)尋址方式:立即尋址、直接尋址、寄存器尋址、寄存器間址。3.3指令分類介紹例1:MOV A,#30H MOV 4FH,A MOV R0,#20H MOV @R0,4FH MOV 21H,20H例2:用兩種尋址方式實(shí)現(xiàn),將片內(nèi)RAM60H單元的數(shù)據(jù)傳送給累加器A。解:MOVA,#60H;(A)=30H;(4FH)=30H;(R0)=20H;(20H)=30H;(21H)=30HMOVR0,60HMOVA,@R0順序執(zhí)行下列指令序列,求每一步執(zhí)行結(jié)果。(×)(×)解:MOVA,60H(√)MOVR0,#60HMOVA,@R0(√)3.3指令分類介紹1.立即數(shù)送累加器A和內(nèi)部數(shù)據(jù)存儲器(Rn,內(nèi)部RAM,SFR)共5條指令:MOVA,#data ;A←#dataMOVdirect,#data ;direct←#dataMOV@Ri,#data ;(Ri)←#data.MOVRn,#data ;Rn←#dataMOVDPTR,#data16 ;DPTR←#data16共有6條指令:MOVA,direct ;A←

(direct)MOVA,@Ri ;A

((Ri))MOVA,Rn ;A

←(Rn)MOVdirect,A ;direct

(A)MOV@Ri,A ;(Ri)←

(A)MOVRn,A ;Rn←

(A)2.內(nèi)部數(shù)據(jù)存貯器(Rn、內(nèi)部RAM、SFR)與累加器A間傳送數(shù)據(jù)3.3指令分類介紹共有5條指令,三種尋址方式:直接尋址,寄存器尋址,寄存器間接尋址。:MOVdirect1,direct2 ;direct1←(direct2)MOVdirect,@Ri ;direct←((Ri))MOVdirect,Rn ;direct←(Rn).MOV@Ri,direct ;(Ri)←(direct)MOVRn,direct ;Rn←(direct)3、內(nèi)部數(shù)據(jù)存貯器中Rn、SFR和片內(nèi)數(shù)據(jù)RAM之間的數(shù)據(jù)傳送只有指令表中的指令才有對應(yīng)指令代碼,計算機(jī)才能執(zhí)行。編程時,不能隨意創(chuàng)造發(fā)明指令。1.一條指令中不能同時出現(xiàn)兩個工作寄存器:

非法指令: MOVR1,R2

MOVR2,@R02.間址寄存器只能使用R0、R1。

非法指令:MOVA,@R23.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù)注意:3.3指令分類介紹二外部數(shù)據(jù)存儲器讀寫傳送指令:(MOVX)DPTR作間接尋址寄存器:

MOVXA,@DPTR ;A←((DPTR))(讀)

MOVX@DPTR,A ;(DPTR)←(A)(寫)2.

Ri作間接尋址寄存器(了解):

MOVX A,@Ri

;A←((P2Ri))(讀)

MOVX @Ri,A ;(P2Ri)←A(寫)實(shí)現(xiàn)外部數(shù)據(jù)存儲器和累加器A之間的數(shù)據(jù)傳送。指令格式:MOVX目的操作數(shù),源操作數(shù)尋址方式:通過A并使用寄存器間接尋址方式。3.3指令分類介紹例3:實(shí)現(xiàn)片外數(shù)據(jù)存儲器2000H內(nèi)的數(shù)據(jù)傳送到2100H單元。 MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A ;DPTR←#2000H ;A←(2000H) ;DPTR←#2100H ;2100H←(A)片外數(shù)據(jù)存儲器不能采用直接尋址。下列為非法指令:MOVXA,2000HMOVX2100H,2000H思考題:為什么對DPTR的數(shù)據(jù)傳送使用內(nèi)部傳送指令?3.3指令分類介紹三程序存儲器讀指令(查表指令):(MOVC)1.DPTR為基址寄存器: MOVC A,@A+DPTR;A?((A)+(DPTR))(讀) 查表范圍為64KB程序存儲器任意空間。2.PC為基址寄存器(了解): MOVC A,@A+PC ;A?((A)+(PC))(讀)實(shí)現(xiàn)從程序存儲器讀取數(shù)據(jù)到累加器A,只能使用變址尋址方式。多用于查常數(shù)表程序,可直接求取常數(shù)表中的函數(shù)值。3.3指令分類介紹例4:以查表方法把累加器A中的十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,并送回累加器中。指令地址源程序

ORG2000H2000H2A:INCA2001MOVCA,@A+PC2002RET2003DB30H2004DB31H2005DB32H……2011DB45H2012DB46H思考題1:偽指令ORG和DB的含義是什么?思考題2:基址寄存器PC的值是如何確定的?3.3指令分類介紹例5:ORG1000H SQU: MOVA,20H ;取X(變量:偏移量) MOVDPTR,#3000H ;確定表首地址(基地址)MOVCA,@A+DPTR ;查表求Y=X2 MOV21H,A ;保存Y(結(jié)果) RET ;子程序結(jié)束 … ORG3000H;常數(shù)表格首地址TAB:DB00,01,04,09,…,225;平方表查表法求Y=X2。設(shè)X(0≤X≤15)在片內(nèi)RAM的20H單元中,要求查表求Y,存入片內(nèi)RAM21H單元。3.3指令分類介紹

ORG1000H ;程序起始地址1000H SQU: MOVA,20H ;取X1002H ADDA,#3 ;修正偏移量1004H MOVCA,@A+PC ;查表求Y=X2(PC=1005H)1005H MOV21H,A ;存結(jié)果1007H RET ;子程序結(jié)束1008H TAB: DB00,01,04 ;平方表100BH DB09,…,225 查表法求Y=X2。設(shè)X(0≤X≤15)在片內(nèi)RAM的20H單元中,要求查表求Y,存入片內(nèi)RAM21H單元。例6:3.3指令分類介紹四交換指令: 1.字節(jié)交換指令:XCHXCHA,Rn;(A)?(Rn)XCHA,@Ri;(A)?((Ri))XCHA,direct;(A)?(direct)思考題:將片內(nèi)RAM60H單元與61H單元的數(shù)據(jù)交換。例7:設(shè)(A)=29H,執(zhí)行指令XCHA,2AH后,(A)=?, (2AH)=?38H29HXCH60H,61H;←對嗎?29H實(shí)現(xiàn)片內(nèi)RAM區(qū)的數(shù)據(jù)雙向傳送。3.3指令分類介紹2.半字節(jié)交換指令:XCHDXCHDA,@Ri ;A3~0

?((Ri))3~03.累加器A高低半字節(jié)交換指令:SWAPSWAPA ;A7~4

?A3~0例8:將片內(nèi)RAM2AH和2BH單元中的低半字節(jié)拼成新字節(jié)存儲到20H單元,其中2BH單元的低半字節(jié)作為新字節(jié)的高半字節(jié)。58HMOV A,#0;MOV R0,#2AH;MOV R1,#2BH;XCHD A,@R0;SWAP A;XCHDA,@R1;XCHA,20H;A0000000000H0101100058H20H30H00110000@R105H00000101A30H00110000@R00101000050HA0101100058HA35H00110101@R138H00111000@R03.3指令分類介紹什么是堆棧?堆棧是一種數(shù)據(jù)結(jié)構(gòu),是只允許在其一端進(jìn)行數(shù)據(jù)插入和數(shù)據(jù)刪除操作的線性表;數(shù)據(jù)寫入堆棧稱為壓入,或叫進(jìn)棧(PUSH);數(shù)據(jù)從堆棧中讀出稱為彈出,或叫出棧(POP);堆棧操作遵循先進(jìn)后出的規(guī)則.堆棧的功用為子程序調(diào)用和中斷操作而設(shè)立,用于保護(hù)斷點(diǎn)和現(xiàn)場;堆棧也可用于數(shù)據(jù)的臨時存放.五堆棧操作指令:3.3指令分類介紹堆棧區(qū)域的開辟堆棧區(qū)域由堆棧指針SP指定;堆棧指針SP是一個SFR,字節(jié)地址是81H;堆棧指針SP的復(fù)位值為07H;實(shí)際工作中通常將堆棧區(qū)域設(shè)在30H到7FH單元間。堆棧操作進(jìn)棧和出棧操作實(shí)際就是對棧頂單元的寫和讀操作;堆棧指針SP總是指示當(dāng)前棧頂位置;進(jìn)棧操作:先SP自動加1,然后寫入數(shù)據(jù);出棧操作:先讀出數(shù)據(jù),然后SP自動減1;3.3指令分類介紹例9:設(shè)(A)=02H,(B)=56H,執(zhí)行下列指令后,(SP)=?,(A)=?,(B)=?SBR:MOVSP,#60H;設(shè)棧底PUSHA PUSHB MOVA,#00H MOV B,#01H … POP B POPASP→××××

×SP→B02H×××02H

×56HASP→B02H××56H02H

×56HASP→B00H××56H02H

×01HASP→B00H××56H02H

×56HASP→B02H××56H02H

×56HA02H56H60HB02H56HA進(jìn)棧指令:PUSHdirect ;SP←(SP)+1,(SP)←(direct)出棧指令:POPdirect ;(direct)←((SP)),SP←(SP)-1

“先加后壓”“先彈后減”3.3指令分類介紹1.五類數(shù)據(jù)傳送指令;2.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù);3.執(zhí)行每條指令,單片機(jī)依次所做的3件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;(2)執(zhí)行指令主體功能,數(shù)據(jù)傳送;(3)修改校驗(yàn)標(biāo)志位P(僅對涉及到累加器A的指令)。4.不要隨意創(chuàng)造指令。數(shù)據(jù)傳送指令總結(jié):3.3指令分類介紹思考題:找出指令錯誤并改正1.MOVA,#1000H;A←1000H(A裝1個字節(jié)數(shù))2.MOVXA,1000H;A←(1000H)片外RAM(DPTR、Ri)3.MOVCA,1000H;A←(1000H)讀ROM(DPTR、PC)4.MOVX60H,A ;片外RAM(60H)←A(應(yīng)為MOV)5.MOVR0,60H;片內(nèi)RAM:(61H)←(60H) MOV61H,@R0(片內(nèi)RAM可直接尋址)

6.XCHR1,R2 ;R1?R2(必須有A參加)7.MOVXDPTR,#2000H;DPTR←2000H(應(yīng)為MOV)8.MOVX60H,@DPTR ;片內(nèi)RAM←片外RAM

(必須有A參加)3.3指令分類介紹3.3.2 算術(shù)運(yùn)算指令完成累加器A和片內(nèi)RAM中數(shù)據(jù)的加減乘除運(yùn)算。多數(shù)算術(shù)運(yùn)算指令的執(zhí)行結(jié)果會自動影響狀態(tài)寄存器PSW中的標(biāo)志位。狀態(tài)寄存器PSW:字節(jié)地址為D0H位序D7D6D5D4D3D2D1D0位符號CYACF0RS1RS0OV--P★思考題:能否根據(jù)PSW的字節(jié)地址,推出PSW中各位的位地址?3.3指令分類介紹1)Cy:進(jìn)位標(biāo)志位 保存運(yùn)算后最高位的進(jìn)位/借位狀態(tài), 當(dāng)有進(jìn)位/借位,Cy=1,否則Cy=0。2)AC:輔助進(jìn)位標(biāo)志位 保存低半字節(jié)的進(jìn)位/借位狀態(tài),用于十進(jìn)制調(diào)整。 當(dāng)D3產(chǎn)生進(jìn)位/借位,AC=1,否則AC=0。3)OV:溢出標(biāo)志位 運(yùn)算結(jié)果按有符號數(shù)+127~-128理解。 有溢出OV=1,否則OV=0。4)P:奇偶標(biāo)志位 反映累加器A中數(shù)據(jù)的奇偶性。 當(dāng)1的個數(shù)為奇數(shù),P=1,否則P=0。例10:已知(A)=3BH,(PSW)=0,執(zhí)行指令”ADDA,#3BH”后求:(A)=?(Cy)=?(OV)=?(AC)=?(P)=? (PSW)=?3.3指令分類介紹一.加法指令:ADD

指令格式:ADDA,源操作數(shù) ;A←(A)+源操作數(shù)結(jié)果影響:Cy、AC、OV、P00111011=3BH+00111011=3BH

0111011076H001101000001=41H位序D7D6D5D4D3D2D1D0位符號CYACF0RS1RS0OV--PADD A,#data; A←(A)+dataADD A,direct; A←(A)+(direct)ADD A,Rn; A←(A)+(Rn)ADD A,@Ri; A←(A)+((Ri))例11:(A)=9AH,(R2)=E3H,(PSW)=0,執(zhí)行指令A(yù)DDCA,R2后求:(A)=?(Cy)=?(OV)=?(AC)=?(P)=? PSW=?3.3指令分類介紹10011010=9AH

11100011=E3H+0101111101=7DH7DH110010000100=84H二.帶進(jìn)位加法指令:ADDC指令格式:ADDCA,源操作數(shù);A←(A)+源操作數(shù)+(Cy)結(jié)果影響:Cy、AC、OV、PADDC A,#data;A←(A)+data+(Cy)ADDC A,direct; A←(A)+(direct)+(Cy)ADDC A,Rn; A←(A)+(Rn)+(Cy)ADDC A,@Ri;A←(A)+((Ri))+(Cy)位序D7D6D5D4D3D2D1D0位符號CYACF0RS1RS0OV--P3.3指令分類介紹帶進(jìn)位加法指令A(yù)DDC用于多字節(jié)加法運(yùn)算:例12:設(shè)雙字節(jié)數(shù)X存在片內(nèi)RAM41H、40H單元,Y存在43H、42H單元,編程求Z=X+Y,并存入片內(nèi)RAM單元46H、45H、44H。MOV A,40HADD A,42HMOV 44H,AMOV A,41HADDC A,43HMOV 45H,AMOV A,#00HADDC A,#00HMOV 46H,ARET;取被加數(shù)低字節(jié);加上加數(shù)低字節(jié);保存和的低字節(jié);取被加數(shù)高字節(jié);加上加數(shù)高字節(jié);保存和的高字節(jié);求高字節(jié)進(jìn)位;子程序結(jié)束;低字節(jié)相加;高字節(jié)相加;計算高字節(jié)進(jìn)位;子程序結(jié)束3.3指令分類介紹三.帶借位減法指令:SUBB000000例13:(A)=5AH,(R2)=5AH,(Cy)=0,執(zhí)行指令SUBBA,R2求: (A)=?(Cy)=?(OV)=?(P)=?(AC)=?思考題:有不帶借位的減法指令嗎?01011010=5AH01011010=5AH

-0

00000000=00H指令格式:SUBBA,源操作數(shù);A←(A)-源操作數(shù)-(Cy)結(jié)果影響:Cy、AC、OV、PSUBB A,#data;A←(A)-data-(Cy)SUBB A,direct; A←(A)-(direct)-(Cy)SUBB A,Rn; A←(A)-(Rn)-(Cy)SUBB A,@Ri;A←(A)-((Ri))-(Cy)3.3指令分類介紹四.加1指令:INC指令格式:INC操作數(shù);操作數(shù)←操作數(shù)+1結(jié)果影響:P(僅對操作數(shù)為A的指令)INC A ;A←(A)+1INC direct ;direct←(direct)+1INC Rn;Rn←(Rn)+1INC @Ri ;(Ri)←((Ri))+1INC DPTR ;DPTR←(DPTR)+1注意:加1指令不影響標(biāo)志位狀態(tài)Cy、AC、OV。3.3指令分類介紹五.減1指令:DEC指令格式:DEC操作數(shù);操作數(shù)←操作數(shù)-1結(jié)果影響:P(僅對操作數(shù)為A的指令)DEC A ;A←(A)-1DEC direct ;direct←(direct)-1DEC Rn;Rn←(Rn)-1DEC @Ri ;(Ri)←((Ri))-1注意:減1指令不影響標(biāo)志位狀態(tài)Cy、AC、OV。沒有指令DECDPTR。3.3指令分類介紹六.乘法指令:MUL指令格式:MULAB;BA←(A)*(B)結(jié)果影響:P、OV、CyMULAB ;BA←(A)*(B)注意:Cy總是被清0;乘積大于255,OV為1,否則OV為0;乘積高字節(jié)存于B中,低字節(jié)存于A中。例14:(A)=96(60H),(B)=192(C0H),執(zhí)行指令MULAB后,求:(A)=?(B)=?(Cy)=?(OV)=?(P)=?解:96×192=18432(4800H)00H48H0103.3指令分類介紹七.除法指令:DIVDIVAB ;A←(A)/(B),B←(A)%(B)注意:Cy總是被清0;若除數(shù)B為0,OV為1,否則OV為0;商存于A中,余數(shù)存于B中。指令格式:DIVAB;A←(A)/(B),B←(A)%(B)結(jié)果影響:P、OV、Cy例15:(A)=246(F6H),(B)=13(0DH),執(zhí)行指令DIVAB后求:(A)=?(B)=?(Cy)=?(OV)=?(P)=?解:246÷13=18(12H),余數(shù)=12(0CH)。12H0CH0003.3指令分類介紹DAA ;把A中按二進(jìn)制相加后的結(jié)果;調(diào)整成按BCD數(shù)相加的結(jié)果調(diào)整原因:1、相加結(jié)果大于9,進(jìn)入無效編碼區(qū);2、相加結(jié)果有進(jìn)位,跳過無效編碼區(qū)。調(diào)整方法:進(jìn)行加“6”修正。八.十進(jìn)制調(diào)整指令:DA指令格式:DAA;BCD碼加減運(yùn)算結(jié)果修正結(jié)果影響:P、AC、Cy3.3指令分類介紹1.八類算術(shù)運(yùn)算指令;2.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù);乘法和除法指令均需要4個機(jī)器周期。3.執(zhí)行每條指令,單片機(jī)依次所做的3件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;(2)執(zhí)行指令主體功能,算術(shù)運(yùn)算;(3)修改標(biāo)志位P、OV、AC、Cy(依不同指令而有差異)。4.不要隨意創(chuàng)造指令。算術(shù)運(yùn)算指令總結(jié):3.3指令分類介紹3.3.3 邏輯運(yùn)算及移位指令一.邏輯與、或、異或運(yùn)算指令:ANL/ORL/XRL指令格式:ANL/ORL/XRL目的操作數(shù),源操作數(shù);

結(jié)果影響:P(僅對目的操作數(shù)為A的指令)ANL A,#data;A←(A)&dataANL A,direct; A←(A)&(direct)ANL A,Rn; A←(A)&(Rn)ANL A,@Ri;A←(A)&((Ri))ANL direct,A;direct←(direct)&(A)ANL direct,#data;direct←(direct)&dataORL A,#data;A←(A)|dataORL

A,direct; A←(A)|(direct)ORL A,Rn; A←(A)|(Rn)ORL A,@Ri;A←(A)|((Ri))ORL

direct,A;direct←(direct)|(A)ORL

direct,#data;direct←(direct)|data3.3指令分類介紹XRL A,#data;A←(A)⊕dataXRL

A,direct; A←(A)⊕(direct)XRL A,Rn; A←(A)⊕(Rn)XRL A,@Ri;A←(A)⊕((Ri))XRL

direct,A;direct←(direct)⊕(A)XRL

direct,#data;direct←(direct)⊕data注意:與0相與值總為0,與1相與值不變;與1相或值總為1,與0相或值不變;與1相異或值取反,與0相異或值不變;上述邏輯運(yùn)算都是按位進(jìn)行的。3.3指令分類介紹例16:(A)=01××××××B,×表示隨機(jī)狀態(tài),為1或0,下述一組指令執(zhí)行后,A的值將如何變化?

XRLA,#0C0H ;

ORLA,#03H ;

ANLA,#0E7H ;將累加器A的內(nèi)容D7、D6取反將累加器A的內(nèi)容D1、D0置1將累加器A的內(nèi)容D4、D3清0解:執(zhí)行上述指令后,A=10×00×11B。3.3指令分類介紹二.累加器A清0和取反指令:CLR/CPL指令格式:CLR/CPLA;

結(jié)果影響:PCLRA ;A←0CPLA ;A←(A)3.3指令分類介紹三.移位指令:RL/RR/RLC/RRC指令格式:RL/RR/RLC/RRCA;

結(jié)果影響:PRLA;An+1

←An,A0

←A7RRA;An

←An+1,A7

←A0RRCA;An

←An+1,Cy←A0,A7

←CyRLCA;An+1

←An,Cy←A7,A0

←Cy注意:左移為乘2,右移為除2;通常用移位指令代替乘除指令.3.3指令分類介紹例17(A)=11000101B,(Cy)=0,分別執(zhí)行下列單條指令:CPLA 求:(A)=?(Cy)=?RLA求:(A)=?(Cy)=?RLCA求:(A)=?(Cy)=? 001110100100010110100010101CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A0CyR6R5Cy;Cy=0,設(shè)R6=55H,R5=AAH;R6=01010101B,R5=10101010B,Cy=0;R6=01010101B,R5=01010100B,Cy=1;R6=10101011B,R5=01010100B,Cy=0思考題:如何將寄存器R6R5中的雙字節(jié)數(shù)X右移一位。用9位循環(huán)指令實(shí)現(xiàn)多字節(jié)移位:例18:編程將寄存器R6R5中的雙字節(jié)數(shù)X左移一位。3.3指令分類介紹例19.試編寫一拆字程序,將累加器A中的高、低四位分開,分別對應(yīng)放到31H單元、30H單元的低四位中,并將31H單元、30H單元的高四位全部補(bǔ)0。MOV R0,#30H ;設(shè)指針MOV R2,A ;暫存ANL A,#0FH ;高半字節(jié)清0MOV @R0,A ;保存數(shù)據(jù)低位INC R0MOV A,R2SWAPA ;ANL A,#0FHMOV @R0,A ;保存數(shù)據(jù)高位3.3指令分類介紹1.三類邏輯運(yùn)算指令;2.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù);常用左移和右移指令代替乘法和除法運(yùn)算。3.執(zhí)行每條指令,單片機(jī)依次所做的3件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;(2)執(zhí)行指令主體功能,邏輯運(yùn)算;(3)修改標(biāo)志位P(僅對涉及到累加器A的指令)。4.不要隨意創(chuàng)造指令。邏輯運(yùn)算指令總結(jié):3.3指令分類介紹3.3.4 位操作指令位操作就是以位(bit)為單位進(jìn)行的運(yùn)算和操作。位操作數(shù):(1)內(nèi)部RAM位尋址區(qū)中的128個可尋址位。 (2)SFR中的可尋址位。 (3)位累加器Cy,它是位傳送的中心。一.位傳送指令:MOVMOVC,bit ;Cy?(bit)MOVbit,C ;bit?(Cy)例20:將位地址20H的一位數(shù)傳送到位地址30H中: MOVC,20H MOV30H,C3.3指令分類介紹二.位置位、復(fù)位指令:SETB、CLR

SETBC ;Cy?1 SETBbit ;bit?1

CLRC ;Cy?0 CLRbit ;bit?0三.位邏輯運(yùn)算:ANL、ORL、CPLANLC,bit ;C←(C)&(bit)ANLC,/bit ;C←(C)&(bit)ORLC,bit ;C←(C)|(bit)ORLC,/bit ;C←(C)|(bit)CPLC ;C←(C)CPLbit ;bit←(bit)3.3指令分類介紹例21:設(shè)(Cy)=1,(位地址40H)=1,執(zhí)行指令 ANL C,/40H后, Cy=?,(位地址40H)=?013.3指令分類介紹1.三類位操作指令;2.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù);3.執(zhí)行每條指令,單片機(jī)依次所做的2件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;(2)執(zhí)行指令主體功能,邏輯運(yùn)算4.不要隨意創(chuàng)造指令。5.位地址的四種表示方法(PSW的位6

):(1)直接使用位地址:D6H(2)位名稱:AC(3)字節(jié)地址加位數(shù)表示:D0H.6(4)專用寄存器符號加位數(shù)表示:PSW.6

位操作指令總結(jié):3.3指令分類介紹3.3.5 控制轉(zhuǎn)移類指令轉(zhuǎn)移指令通過改寫PC的當(dāng)前值,從而改變CPU執(zhí)行程序的順序,使程序發(fā)生跳轉(zhuǎn)。1000H 1003H 1005H 1006H 1008H ;3字節(jié);2字節(jié);1字節(jié);2字節(jié)ORG 1000HMOV 30H,20H

MOV A,#30H

CLR A

SETB 40H

......非轉(zhuǎn)移指令舉例:PC?(PC)+3PC?(PC)+2PC?(PC)+1PC?(PC)+23.3指令分類介紹轉(zhuǎn)移指令舉例:3.3指令分類介紹按轉(zhuǎn)移條件分類:1)無條件轉(zhuǎn)移:(LJMP、AJMP、SJMP、JMP)執(zhí)行無條件轉(zhuǎn)移指令,程序無條件轉(zhuǎn)移到指定處。2)條件轉(zhuǎn)移:指令中給出轉(zhuǎn)移條件,執(zhí)行指令時,先測試條件:若滿足條件,則程序發(fā)生轉(zhuǎn)移;否則,仍順序執(zhí)行程序。按轉(zhuǎn)移方式分類:1)絕對轉(zhuǎn)移:指令給出轉(zhuǎn)移目的的絕對地址d2d1,執(zhí)行指令后,PC?d2d1。2)相對轉(zhuǎn)移:指令給出轉(zhuǎn)移目的與轉(zhuǎn)移指令的相對偏移量rel,執(zhí)行指令后,PC?(PC)+rel。

目的地址=PC+字節(jié)數(shù)+rel例22:地址 源程序 1000HSJMP07 ;2字節(jié)指令 … 1009H … ;轉(zhuǎn)移目的指令3.3指令分類介紹一.無條件轉(zhuǎn)移指令:LJMP、AJMP、SJMP、JMPLJMP addr16(d2d1) ;長跳轉(zhuǎn)指令,64K跳轉(zhuǎn) ;PC?d2d1AJMPaddr11(雙字節(jié)) ;絕對跳轉(zhuǎn)指令,2K跳轉(zhuǎn) ;PC?(PC)+2 ;PC10~0?addr11 ;PC15~11不變SJMPrel ;相對跳轉(zhuǎn)指令,256字節(jié) ;PC?(PC)+2+relJMP@A+DPTR ;變址尋址長跳轉(zhuǎn)指令,64K跳轉(zhuǎn) ;PC?(A)+(DPTR)3.3指令分類介紹

1.長轉(zhuǎn)移指令:

LJMPaddr16(d2d1) ;PC?(PC)+2 ;PC?d2d1 目的地址=d2d1指令轉(zhuǎn)移范圍:64KB例23:1830HLJMP0100H ;執(zhí)行結(jié)果:PC?0100H3.3指令分類介紹2.絕對轉(zhuǎn)移指令:AJMPaddr11 ;PC?(PC)+2 ;PC10~0?addr11,PC15~11不變目的地址={PC15~11不變,PC10~0?addr11}addr11也是雙字節(jié);轉(zhuǎn)移時要求轉(zhuǎn)移前后保持PC15~11不變。64K空間分為32組,只能組內(nèi)跳轉(zhuǎn);指令轉(zhuǎn)移范圍:2KB;例24:1830HAJMP0100H ;執(zhí)行結(jié)果:PC?1900H

07FFHAJMP0100H;執(zhí)行結(jié)果:PC?0900H3.3指令分類介紹3.短轉(zhuǎn)移(相對跳轉(zhuǎn))指令:

SJMPrel ;PC?(PC)+2;PC?(PC)+rel目的地址=(PC)+2+rel;相對偏移量rel為8位帶符號的補(bǔ)碼數(shù);rel為正數(shù):向前轉(zhuǎn)移;rel為負(fù)數(shù):向后轉(zhuǎn)移;指令轉(zhuǎn)移范圍:前126~后129字節(jié)。實(shí)際編程中,通常用標(biāo)號代替轉(zhuǎn)移的相對偏移量rel,相對偏移量rel的值交給編譯器計算。

SJMPNEXT

NEXT:…3.3指令分類介紹KEY: MOVDPTR,#KTABMOVA,40HADDA,AJMP@A+DPTRKTAB: AJMPFUNC0 AJMPFUNC1 …FUNC0:… FUNC1:…應(yīng)用:處理功能鍵。例25:要求不同鍵執(zhí)行不同程序段。每個鍵對應(yīng)一個鍵值X(0~FH)。X已存入40H單元中。若X=0,則執(zhí)行程序段FUNC0;若X=1,則執(zhí)行程序段FUNC1; …4.變址尋址轉(zhuǎn)移指令(多分支轉(zhuǎn)移指令): JMP@A+DPTR ;PC←(PC)+2 ;PC←(A)+(DPTR) 目的地址=(A)+(DPTR) 指令轉(zhuǎn)移范圍64KB。3.3指令分類介紹二、條件轉(zhuǎn)移指令:1.判累加器A值的轉(zhuǎn)移指令:

JZrel ;若A=00H,PC←(PC)+2+rel(轉(zhuǎn)移), ;若A≠00H,PC←(PC)+2JNZrel ;若A≠00H,PC←(PC)+2+rel(轉(zhuǎn)移) ;若A=00H,PC←(PC)+2條件轉(zhuǎn)移就是設(shè)有條件的程序轉(zhuǎn)移。執(zhí)行指令時,若滿足條件則程序轉(zhuǎn)移,否則程序順序執(zhí)行。條件轉(zhuǎn)移指令形成程序的分支,賦予計算機(jī)判斷決策能力。3.3指令分類介紹3.判位轉(zhuǎn)移指令: JBbit,rel ;(bit)=1轉(zhuǎn)移,否則不轉(zhuǎn)移 JNBbit,rel ;(bit)=0轉(zhuǎn)移,否則不轉(zhuǎn)移4.判位清0轉(zhuǎn)移指令: JBCbit,rel ;(bit)=1轉(zhuǎn)移,且bit←0, ;否則不轉(zhuǎn)移2.判Cy值的轉(zhuǎn)移指令:

JCrel ;Cy=1則轉(zhuǎn)移,Cy=0不轉(zhuǎn)移 JNCrel ;Cy=0則轉(zhuǎn)移,Cy=1不轉(zhuǎn)移3.3指令分類介紹;若操作數(shù)1=操作數(shù)2,順序執(zhí)行,且Cy=0。;若操作數(shù)1≠操作數(shù)2,則程序跳轉(zhuǎn) ;且當(dāng)操作數(shù)1>操作數(shù)2,Cy=0, ;且當(dāng)操作數(shù)1<操作數(shù)2,Cy=1。相當(dāng)于兩個操作數(shù)相減,僅影響標(biāo)志位Cy,不保存結(jié)果。5.比較不相等轉(zhuǎn)移指令:

指令格式:CJNE操作數(shù)1,操作數(shù)2,relCJNE A,#data,relCJNE A,direct,relCJNE Rn,#data,relCJNE @Rn,#data,rel3.3指令分類介紹

6.減1(循環(huán))轉(zhuǎn)移指令:

指令格式:DJNZ操作數(shù),rel

用于循環(huán)結(jié)構(gòu)程序設(shè)要求某段程序循環(huán)執(zhí)行100次。 MOVR2,#100 ;設(shè)循環(huán)計數(shù)器初值LOOP: … ;多次循環(huán)程序段… DJNZR2,LOOP ;循環(huán)控制 … ;循環(huán)結(jié)束 思考題:當(dāng)循環(huán)計數(shù)器初值為0,循環(huán)次數(shù)是多少?DJNZ Rn,relDJNZ direct,rel;操作數(shù)←操作數(shù)-1。;若操作數(shù)≠

0,則程序跳轉(zhuǎn),否則程序順序執(zhí)行。3.3指令分類介紹例26:編寫子程序,將內(nèi)部數(shù)據(jù)存儲器30H~35H單元的數(shù)據(jù)傳送到外部數(shù)據(jù)存儲器的2003H~2008H單元. MOV R0,#30H ;指針首地址 MOV DPTR,#2003H ;指針首地址 MOV R1,#06H ;字節(jié)個數(shù)LOOP: MOV A,@R0 ;取數(shù)據(jù) MOVX@DPTR,A ;保存數(shù)據(jù) INC R0 ;指針加1 INC DPTR ;指針加1 DJNZ R1,LOOP ;判斷是否傳送完

RET3.3指令分類介紹 例27:設(shè)一AT89C51單片機(jī)系統(tǒng)的外接晶振頻率為6MHz,試編寫一段延時約100ms的子程序。分析:T=12/6MHz=2μs 100ms/2μs=50000

Delay:MOVR7,#64H ;1T,設(shè)循環(huán)計數(shù)器初值(100次)LOOP:MOVR6,#0FAH;1T,循環(huán)250次 DJNZR6,$ ;2T,循環(huán)控制DJNZR7,LOOP;2T,循環(huán)控制RET ;2T計算實(shí)際延時時間:t=2μs+100×(2μs+1ms+2×2μs)+4μs=100.606ms 3.3指令分類介紹1.分為無條件轉(zhuǎn)移和有條件轉(zhuǎn)移兩類指令;2.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù);3.執(zhí)行每條指令,單片機(jī)依次所做的3件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;

操作數(shù)自減1(僅DJNZ指令).(2)執(zhí)行指令主體功能,再次修改PC指針.(3)修改狀態(tài)位Cy(僅有CJNE指令)

4.不要隨意創(chuàng)造指令??刂妻D(zhuǎn)移類指令總結(jié):3.3指令分類介紹3.3.6子程序調(diào)用和返回指令子程序調(diào)用和返回指令也使程序發(fā)生轉(zhuǎn)移。一.長調(diào)用指令:

LCALLaddr16 ;PC?(PC)+3, ;SP?(SP)+1,(SP)?(PC0~7); ;SP?(SP)+1,(SP)?(PC8~15); ;PC?addr16 addr16為子程序起始地址,編程時可用標(biāo)號代替。 指令調(diào)用范圍:64KB子程序調(diào)用過程:與轉(zhuǎn)移指令不同:轉(zhuǎn)移時,先用堆棧保存當(dāng)前PC地址。3.3指令分類介紹三.絕對調(diào)用指令:

ACALLaddr11 ;PC?(PC)+2 ;SP?(SP)+1,(SP)?PC0~7

;SP?(SP)+1,(SP)?PC8~15

;PC10~0?addr11 ;PC15~11不變

addr11為子程序首地址 指令調(diào)用范圍2KB。二.子程序返回指令: RET/RETI

RET ;PC?(PC)+2 ;PC15~8?((SP)),SP?(SP)-1,;PC7~0?((SP)),SP?(SP)-1 RET指令從堆棧彈出保存的PC地址,實(shí)現(xiàn)子程序返回。PC3.3指令分類介紹例28:子程序嵌套:

20H 92H21H53H

SP→ 2000H

208FH

2092H

2100H

2150H

2153H

2200H

2250H

2251H

2153H

2092H

21FFH

2200H

SP→

SP→

SP→

SP→

SP→

SP→3.3指令分類介紹注意:下面的子程序執(zhí)行完畢后將無法返回主程序.MAIN: MOVSP,#65H ;主程序 LCALL SUBR ;調(diào)用SUBR … …SUBR: PUSH ACC ;子程序首地址 PUSH PSW … RET ;子程序返回1、子程序起始指令要使用標(biāo)號,用作子程序名。2、執(zhí)行返回指令RET之前,保證棧頂內(nèi)容為主程序返回地址,以便正確返回主程序。3.3指令分類介紹下面的子程序執(zhí)行完畢后將正常返回主程序.MAIN: MOVSP,#65H ;主程序 LCALL SUBR ;調(diào)用SUBR … …SUBR: PUSH ACC … ;子程序首地址 … POP ACC RET ;子程序返回3.3指令分類介紹1.僅有LCALL、ACALL、RET三條指令;2.指令表中的兩個參數(shù):指令字節(jié)數(shù)和機(jī)器周期數(shù);3.執(zhí)行調(diào)用指令,單片機(jī)依次所做的3件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;(2)將PC指針?biāo)傅刂穳喝攵褩?,為子程序返回做?zhǔn)備;(3)執(zhí)行指令主體功能,修改PC,將子程序首地址賦給PC。4.執(zhí)行返回指令,單片機(jī)依次所做的3件工作:(1)依據(jù)指令字節(jié)數(shù)修改PC指針,為執(zhí)行下一指令做準(zhǔn)備;(2)執(zhí)行指令主體功能,修改PC,從堆棧中彈出值賦給PC。5.不要隨意創(chuàng)造指令。子程序調(diào)用和返回指令總結(jié):3.3指令分類介紹本章總結(jié)1、指令的尋址方式、格式、功能和使用方法。7種尋址方式: 立即尋址; 直接尋址; 寄存器尋址; 寄存器間接尋址; 變址尋址; 位尋址; 相對尋址。2、指令分類介紹。數(shù)據(jù)傳送類1.用立即尋址指令可直接給片內(nèi)RAM中20H、25H單元和P1口上置數(shù):MOV20H,#25HMOV25H,#10HMOVP1,#0CAH執(zhí)行后使(20H)=

,(25H)=

,(P1)=

。若將其作為初值,再執(zhí)行下列程序:MOVR0,#20H;MOVA,@R0;MOVR1,A;

溫馨提示

  • 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

提交評論