單片機(jī)51系列指令系統(tǒng)與程序設(shè)計(jì)方法_第1頁
單片機(jī)51系列指令系統(tǒng)與程序設(shè)計(jì)方法_第2頁
單片機(jī)51系列指令系統(tǒng)與程序設(shè)計(jì)方法_第3頁
單片機(jī)51系列指令系統(tǒng)與程序設(shè)計(jì)方法_第4頁
單片機(jī)51系列指令系統(tǒng)與程序設(shè)計(jì)方法_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

3.1指令格式和偽指令

3.3指令系統(tǒng)

3.4程序設(shè)計(jì)方法第3章51系列指令系統(tǒng)與程序設(shè)計(jì)方法單片機(jī)原理與應(yīng)用

3.2尋址方式2023/2/11一、匯編語言指令格式:[標(biāo)號(hào):]操作碼助記符操作數(shù)1,操作數(shù)2[;注釋]換行表示一條指令結(jié)束。例:LOOP:MOVA,#40H

;取參數(shù)1.標(biāo)號(hào):指令的符號(hào)地址。2.操作碼:指明指令操作功能。3.操作數(shù):指令操作對(duì)象。數(shù)據(jù)、地址、寄存器名及約定符號(hào)。4.注釋行:說明指令在程序中的作用。操作碼和操作數(shù)是指令主體。MOV—move傳送XCH—exchange交換ANL—andlogic與邏輯運(yùn)算XRL—exclusiveor異或運(yùn)算MUL—multiply乘法RR—rotateright右循環(huán)SJMP—shortjump短跳轉(zhuǎn)RET—return子程序返回3.1指令格式和偽指令標(biāo)號(hào):必須以字母和下劃線開頭,由字母或數(shù)字組成。2023/2/12二、偽指令:匯編的控制指令,僅提供匯編信息,不產(chǎn)生指令代碼。ORG—起始地址指令(定位偽指令):格式:ORG表達(dá)式指明程序和數(shù)據(jù)塊起始地址,表達(dá)式是一個(gè)絕對(duì)或地址偏移值。 指令地址機(jī)器碼 源程序

ORG2000H 2000H7830 MAIN:MOVR0,#30H 2002HE6 MOVA,@R0…

2023/2/133.

DB—定義字節(jié)型常數(shù)指令。

格式:[標(biāo)號(hào):]DBn1,n2,n3,….nn例:DB12H,100,‘A’作用:定義一個(gè)字節(jié)常數(shù)表4.

DW—定義字型常數(shù)指令。格式:[標(biāo)號(hào):]DW

n1,n2,n3,….nn例:

DW1234H,5678H作用:定義一個(gè)地址表或字常數(shù)表注:3和4這兩個(gè)都是在程序存儲(chǔ)器中存放。2.位地址賦值偽指令格式:符號(hào)名BIT位地址作用:將一個(gè)位地址賦給一個(gè)符號(hào)名。ClockBIT90H;定義P1.0為時(shí)鐘線clock

2023/2/145.賦值偽指令EQU

格式:符號(hào)名EQU表達(dá)式(寄存器名)將表達(dá)式或一個(gè)寄存器名賦給一個(gè)符號(hào)名。

X1 EQU2000H

X2 EQU0FH

MAIN:MOVDPTR,#X1

ADDA,#X2

6.

END—結(jié)束匯編偽指令。例:START:……ENDSTART2023/2/15二、機(jī)器語言指令格式: 操作碼[操作數(shù)1][,操作數(shù)2] 有單字節(jié)、雙字節(jié)和三字節(jié)指令。匯編語言指令中操作碼和操作數(shù)是指令主體,稱為指令可執(zhí)行部分,指令表中可查出對(duì)應(yīng)指令代碼。舉例: 匯編語言: 機(jī)器語言:

MOVA,R0

E8H MOVR6,#32H 7E32H MOV40H,#64H 754064H1110100001111110001100100111010101000000011001002023/2/16三、常用的主要縮寫符號(hào)

A累加器Acc

AB寄存器對(duì)

direct直接地址00H~0FFH#data立即數(shù),表示一個(gè)常數(shù)

00H~0FFH

@間接尋址標(biāo)記X寄存器名(X)X寄存器內(nèi)容((X))由X寄存器尋址的存儲(chǔ)器單元內(nèi)容$本條指令起始地址rel

相對(duì)偏移量-128~+127rrr

其值由工作寄存器Rn確定,R0~R7對(duì)應(yīng)000~1112023/2/17尋址方式:尋找本條指令中操作數(shù)的有效地址方式。主要的尋址方式有:立即尋址;直接尋址;寄存器尋址;寄存器間接尋址;基寄存器加變址寄存器間接尋址;

還有相對(duì)尋址等。

3.2指令尋址方式2023/2/18一、操作數(shù)類型:位(bit)─位尋址區(qū)中的一位二進(jìn)制數(shù)據(jù)字節(jié)(Byte)─8位二進(jìn)制數(shù)據(jù)字(Word)─16位雙字節(jié)數(shù)據(jù)二、尋址方式:1.立即尋址方式:

指令中給出實(shí)際操作數(shù)據(jù)(立即數(shù)),一般用于為寄存器或存儲(chǔ)器賦常數(shù)初值。舉例:

8位立即數(shù):MOVA,#40H ;A?40H16位立即數(shù):MOVDPTR,#2100H;DPTR?2100H2023/2/192.直接尋址方式:

指令操作數(shù)是存儲(chǔ)器單元地址,數(shù)據(jù)放在存儲(chǔ)器單元中。

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

78H40H

56H

例:設(shè)存儲(chǔ)器兩個(gè)單元的內(nèi)容如圖所示,執(zhí)行指令MOVA,40H后A=?思考題:

直接尋址方式指令和立即尋址方式指令的形式有什么不同?56H2023/2/1103.寄存器尋址方式:4.寄存器間接尋址方式:

指令的操作數(shù)為寄存器名,寄存器中為數(shù)據(jù)地址。存放地址的寄存器稱為間址寄存器或數(shù)據(jù)指針。例: MOVA,@R0 ;A?((R0))

設(shè)指令執(zhí)行前A=20H,R0=40H,地址為40H存儲(chǔ)器單元內(nèi)容如圖所示。執(zhí)行指令后,A=?,R0=?,(40H)=?34H40H34H01000000AR000100000

41H 67H

40H34HR0→A20HR040H例:

MOVA,R0 ;A?(R0)

設(shè)指令執(zhí)行前A=20H,R0=40H,

執(zhí)行指令后,A=?,R0=?指令操作數(shù)為寄存器名,數(shù)據(jù)在寄存器中。40H40H2023/2/1115.基寄存器加變址寄存器間接尋址方式:

例:

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

89H2009H

12H

數(shù)據(jù)在存儲(chǔ)器中,指令給出的寄存器為數(shù)據(jù)的基地址(基寄存器PC和DPTR)和偏移量(變址寄存器A)。

數(shù)據(jù)地址=基地址+偏移量。

說明:1、只對(duì)程序存儲(chǔ)器;

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

MOVCA,@A+PC

JMP@A+DPTR2023/2/112指令給出位地址。一位數(shù)據(jù)在存儲(chǔ)器位尋址區(qū)。(1)內(nèi)部RAM中的位尋址區(qū):字節(jié)地址為20H~2FH;(2)專用寄存器的可尋址位:11個(gè)(83位)表示方法:1)直接使用位地址;如:PSW的位6可表示為0D6H2)位名稱表示;或AC3)字節(jié)地址加位數(shù)表示;或0D0H.64)專用寄存器符號(hào)加位數(shù)表示。或PSW.6例:

MOVC,40H ;CY(位地址40H)設(shè)指令執(zhí)行前CY=1,位地址40H存儲(chǔ)器單元如圖,執(zhí)行指令后,CY=?29H0110001028H11010110位尋址區(qū)06.位尋址方式(可歸屬于直接尋址):2023/2/1137.相對(duì)尋址方式:目的地址=轉(zhuǎn)移指令地址+轉(zhuǎn)移指令字節(jié)數(shù)+rel

(rel為偏移量)

當(dāng)前PC值加上指令中規(guī)定的偏移量rel,構(gòu)成實(shí)際的操作數(shù)地址例:

SJMPrel

操作:跳轉(zhuǎn)到的目的地址=當(dāng)前16位PC值+rel注意:1)“當(dāng)前PC值”指程序中下一條指令所在的首地址,是一個(gè)16位數(shù);2)符號(hào)“rel”表示“偏移量”,是一個(gè)帶符號(hào)的單字節(jié)數(shù),范圍是:-128~+127(80H~7FH)。在實(shí)際編程中,“rel”通常用標(biāo)號(hào)代替。2023/2/114

3.3指令系統(tǒng)單片機(jī)所能執(zhí)行的各種指令的集合稱為它的指令系統(tǒng)

指令的分類:每條指令在程序存儲(chǔ)器ROM中占據(jù)一定的空間,以字節(jié)為單位。51系列按指令所占字節(jié)數(shù)分類:

單字節(jié)(49條);雙字節(jié)(46條);3字節(jié)(16條)

每條指令在執(zhí)行時(shí)要花去一定的時(shí)間,以機(jī)器周期為單位。51系列按指令執(zhí)行時(shí)間分類:

單周期(64條);雙周期(45條);4周期(2條)按指令的功能分類,可分為5大類:51系列有

數(shù)據(jù)傳送類(29條);算術(shù)運(yùn)算類(24條);邏輯運(yùn)算及移位類(24);控制轉(zhuǎn)移類(17條);位操作類(17條)2023/2/115

3.3.1數(shù)據(jù)傳送指令 最基本和最重要的指令類,可實(shí)現(xiàn)寄存器、存儲(chǔ)器之間的數(shù)據(jù)傳送。 一、內(nèi)部傳送指令: 片內(nèi)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送。二、外部傳送指令: 片外數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送。 三、交換指令: 片內(nèi)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送。四、堆棧操作指令: 片內(nèi)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送。五、查表指令: 程序存儲(chǔ)器數(shù)據(jù)傳送。2023/2/116(一)內(nèi)部傳送指令:習(xí)題:找出配對(duì)指令,實(shí)現(xiàn)反向傳送。指令機(jī)器碼:11101rrr

E8~EF11100101n

E5

n1110011i

E6、E7

01110100d74d

10101rrrn

1010011in85n1n2

90d1d2MOVA,Rn

;A←(Rn),Rn=R0~R7MOVA,direct

;A←(direct)MOVA,@Ri

;A←((Ri)),Ri=R0、R1

MOVA,#data

;A←data

MOVRn,direct

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

;(direct1)←(direct2)

MOVDPTR,#d1d2 ;DPTR←d1d2

實(shí)現(xiàn)片內(nèi)數(shù)據(jù)存儲(chǔ)器中數(shù)據(jù)傳送。指令格式:

MOV

目的操作數(shù),源操作數(shù)尋址方式:立即尋址、直接尋址、寄存器尋址、寄存器間址。2023/2/117例:MOVA,#30H MOV4FH,A MOVR0,#20H MOV@R0,4FH MOV21H,20H習(xí)題:用兩種尋址方式實(shí)現(xiàn),將片內(nèi)RAM

60H單元的數(shù)據(jù)傳送給累加器A。解:MOVA,#60H(×)MOVR0,#60H(√)MOVA,@R0;A=30H;(4FH)=30H;R0=20H;(20H)=30H;(21H)=30HMOVR0,60HMOVA,@R0

(×)

解:MOVA,60H

(√)

結(jié)果A=32H順序執(zhí)行下列指令序列,求每一步執(zhí)行結(jié)果。2023/2/118說明:只有指令表中的指令才有對(duì)應(yīng)指令代碼,計(jì)算機(jī)才能執(zhí)行。編程時(shí),不能隨意創(chuàng)造發(fā)明指令。1.一條指令中不能同時(shí)出現(xiàn)兩個(gè)工作寄存器:

非法指令: MOVR1,R2

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

非法指令:MOVA,@R23.SFR區(qū)只能直接尋址,不能用寄存器間接尋址。

非法指令:MOVR0,#80H

MOVA,@R02023/2/119(二)外部RAM傳送指令:(MOVX)

指令格式:MOVX

目的操作數(shù),源操作數(shù)尋址方式:片外數(shù)據(jù)存儲(chǔ)器用寄存器間址方式。DPTR作16位數(shù)據(jù)指針,尋址64KB片外RAM空間:

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

MOVX@DPTR,A ;(DPTR)←A(寫)2.Ri作8位數(shù)據(jù)指針,尋址256B片外RAM空間(頁內(nèi)尋址):

MOVX A,@Ri

;A←((P2Ri))

(讀) MOVX @Ri,A

;(P2Ri)←A(寫)實(shí)現(xiàn)片外數(shù)據(jù)存儲(chǔ)器和A累加器之間的數(shù)據(jù)傳送。

2023/2/120例:實(shí)現(xiàn)片外數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送(2000H)?(2100H)。

MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A習(xí)題:將片外RAM0000H單元的數(shù)據(jù)傳送到片內(nèi)RAM的60H單元。

;DPTR=2000H ;A=X ;DPTR=2100H ;(2100H)=X片外數(shù)據(jù)存儲(chǔ)器不能直接尋址。下列為非法指令:

MOVXA,2000HMOVX2100H,2000H思考題:為什么對(duì)DPTR的數(shù)據(jù)傳送使用內(nèi)部傳送指令?2023/2/121(三)ROM傳送指令(查表指令):(MOVC)

1.DPTR為基址寄存器:

MOVC A,@A+DPTR;A?((A+DPTR))(讀) 查表范圍為64KB

程序存儲(chǔ)器任意空間,稱為遠(yuǎn)程查表指令。2.PC為基址寄存器:

MOVC A,@A+PC ;A?((A+PC))(讀)

常數(shù)表只能在查表指令后256B范圍內(nèi),稱為近程查表指令。實(shí)現(xiàn)從程序存儲(chǔ)器讀取數(shù)據(jù)到A累加器,只能使用變址間接尋址方式。

多用于查常數(shù)表程序,可直接求取常數(shù)表中的函數(shù)值。2023/2/122例1:以查表方法把累加器中的十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,并送回累加器中。程序如下:指令地址源程序

ORG2000H2000HBA:INCA2001MOVCA,@A+PC

2002RET2003DB30H2004DB31H2005DB32H……2011DB45H2012DB46H2023/2/123例2:程序:ORG1000H SQU: MOVDPTR,#3000H ;確定表首地址(基地址)

MOVA,20H ;取X(變量:偏移量)MOVCA,@A+DPTR

;查表求Y=X2 MOV21H,A ;保存Y(結(jié)果) RET ;子程序結(jié)束 … ;其它程序段

ORG3000H;常數(shù)表格首地址TAB:DB00,01,04,09,…,225 ;平方表

END方法1:查表法求Y=X2。設(shè)X(0≤X≤15)在片內(nèi)RAM的20H單元中,要求查表求Y,存入片內(nèi)RAM21H單元。2023/2/124指令地址

源程序

ORG1000H ;程序起始地址 1000H SQU: MOVA,20H ;取X 1002H 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 方法2:查表法求Y=X2。設(shè)X(0≤X≤15)在片內(nèi)RAM的20H單元中,要求查表求Y,存入片內(nèi)RAM21H單元。例2:2023/2/125(四)交換指令:

1.字節(jié)交換指令

XCHA,Rn

;A?(Rn)

XCHA,@Ri

;A?((Ri))

XCHA,direct

;A?(direct)習(xí)題:將片內(nèi)RAM60H單元與61H單元的數(shù)據(jù)交換。例:設(shè)A=29H,執(zhí)行指令XCHA,2AH后,A=?, (2AH)=?38H29HXCH60H,61H;

←對(duì)嗎?29H不對(duì)!!實(shí)現(xiàn)片內(nèi)RAM區(qū)的數(shù)據(jù)雙向傳送。2023/2/1262.半字節(jié)交換指令:XCHDA,@Ri;A0~3

?((Ri))0~3SWAPA ;A4~7

?A0~3例:將片內(nèi)RAM2AH和2BH單元中的ASCII碼轉(zhuǎn)換成壓縮式BCD碼存入20H單元。58H習(xí)題:交換片內(nèi)RAM40H單元和41H單元的低半字節(jié)。A30H010100000101100050H58HMOVA,#0MOVR0,#2AHMOVR1,#2BHXCHDA,@R0SWAPAXCHDA,@R1XCHA,20H0011000005H0000000000H0000010120HR1A0101100058H30H00110000R0AA35H00110101R138H00111000R02023/2/127(五)堆棧操作指令:

例:設(shè)

A=02H,B=56H,執(zhí)行下列指令后,SP=?,A=?,B=?SBR:MOVSP,#30H;設(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

×56HA02H56H30HB02H56HA入棧指令:PUSHdirect;SP←SP+1,(SP)←(direct)出棧指令:POPdirect;(direct)←(SP),SP←SP-1

“先加后壓”

“先彈后減”2023/2/128練習(xí):

說明程序執(zhí)行過程中,SP的內(nèi)容及堆棧中內(nèi)容的改變過程。

程序如下:

MOVSP,#30HMOVA,#20HMOVB,#30HPUSHAPUSHB……POPAPOPB;SP=30H;A=20H;B=30H;SP=31H(31H)=20H;SP=32H(32H)=30H……;A=30HSP=31H;B=20HSP=30H2023/2/129習(xí)題:找出指令錯(cuò)誤并改正:1.MOVA,#1000H;A←1000H(A裝1個(gè)字節(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參加)2023/2/1303.3.2 算術(shù)運(yùn)算指令與數(shù)據(jù)傳送指令不同,多數(shù)算術(shù)運(yùn)算指令會(huì)影響標(biāo)志位的狀態(tài),即CPU執(zhí)行算術(shù)運(yùn)算指令后,根據(jù)數(shù)據(jù)操作情況自動(dòng)設(shè)置標(biāo)志位的狀態(tài)。

MCS-51的程序狀態(tài)字寄存器PSW

為標(biāo)志寄存器。其格式如下:字節(jié)地址為D0H位序B7B6B5B4B3B2B1B0位符號(hào)CYACF0RS1RS0OVF1P2023/2/1311.標(biāo)志位(自動(dòng)設(shè)置狀態(tài)):1)CY:進(jìn)位標(biāo)志位(B7) 保存運(yùn)算后最高位的進(jìn)位/借位狀態(tài),當(dāng)有進(jìn)位/借位,CY=1,否則Cy=0。2)AC:輔助進(jìn)位標(biāo)志位(B6) 保存低半字節(jié)的進(jìn)位/借位狀態(tài),當(dāng)D3產(chǎn)生進(jìn)位/借位,AC=1,否則AC=0。用于十進(jìn)制調(diào)整。3)OV:溢出標(biāo)志位(B2)

OV=Cy7?Cy6,補(bǔ)碼運(yùn)算產(chǎn)生溢出OV=1,否則OV=0。4)P:奇偶標(biāo)志位(B0) 反映累加器A中數(shù)據(jù)的奇偶性。當(dāng)1的個(gè)數(shù)為奇數(shù),P=1,否則P=0。2023/2/1322.用戶選擇位(編程設(shè)置狀態(tài))1)F0、F1:用戶自定義標(biāo)志位。

2)RS1、RS0

工作寄存器區(qū)選擇位。

復(fù)位時(shí),PSW=00H例:復(fù)位后,設(shè)置使用工作寄存器3區(qū),其余標(biāo)志位不變。解:MOVPSW,#18HRS1RS0工作寄存器000區(qū)011區(qū)102區(qū)113區(qū)位序B7B6B5B4B3B2B1B0位符號(hào)CYACF0RS1RS0OVF1P2023/2/133算術(shù)運(yùn)算指令: 加減指令(讀-修改-寫): 1.加法指令:

00111011=3BH

+00111011=3BH

0111011076H0011 1)不帶進(jìn)位加法:ADDA,源操作數(shù)如:ADDA,R2;A←A+R2,影響CY、OV、AC、P

例1:已知A=3BH,PSW=0,執(zhí)行指令

ADDA,#3BH后求:A=?Cy=?OV=?AC=?P=? PSW=?01000001=41H完成片內(nèi)RAM和A中數(shù)據(jù)的加減乘除運(yùn)算。位序B7B6B5B4B3B2B1B0位符號(hào)CYACF0RS1RS0OVF1P2023/2/134

10011010=9AH

11100011=E3H+

0

1

01111101=7DH

2)帶進(jìn)位加法:

ADDCA,源操作數(shù)

如:ADDCA,R2

;A←A+R2+Cy,影響Cy、OV、AC、P7DH1100

例:A=9AH,R2=E3H,PSW=0,執(zhí)行指令

ADDCA,R2

后求:

A=?Cy=?OV=?AC=?P=? PSW=?10000100=84H位序B7B6B5B4B3B2B1B0位符號(hào)CYACF0RS1RS0OVF1P2023/2/135帶進(jìn)位加法指令A(yù)DDC用于多字節(jié)運(yùn)算:例:設(shè)雙字節(jié)數(shù)X存在片內(nèi)RAM41H、40H單元,Y存在42H、43H單元,編程求Z=X+Y,并存入片內(nèi)RAM單元44H、45H、46H。MOVA,40HADDA,42HMOV44H,AMOVA,41HADDCA,43HMOV45H,AMOVA,#00HADDCA,#00HMOV46H,ARET;取被加數(shù)低字節(jié);加上加數(shù)低字節(jié);保存和的低字節(jié);取被加數(shù)高字節(jié);加上加數(shù)高字節(jié);保存和的高字節(jié);求高字節(jié)進(jìn)位;子程序結(jié)束;低字節(jié)相加;高字節(jié)相加;計(jì)算高字節(jié)進(jìn)位;子程序結(jié)束2023/2/136十進(jìn)制加法指令:僅對(duì)加法結(jié)果進(jìn)行調(diào)整

ADDA,源操作數(shù) DAA帶進(jìn)位十進(jìn)制加1法指令:

ADDCA,源操作數(shù) DAA作業(yè):BCD碼加法編程。 設(shè)X、Y為4位壓縮BCD碼,求Z=X+Y。BCD調(diào)整指令:BCD:Binary-Coded-Decimal(二進(jìn)制編碼的十進(jìn)制)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”修正。2023/2/1372.減法指令:

如:SUBBA,R2

;A←A-R2-Cy, ;影響Cy、OV、AC、P000000習(xí)題:編程求雙字節(jié)減法。設(shè)X、Y存在片內(nèi)RAM60H起始單元,計(jì)算

Z=X-Y。例:A=5AH,R2=5AH,Cy=0,執(zhí)行下列指令

SUBBA,R2求: A=?Cy=?OV=?P=?AC=?思考:有不帶借位的減法指令嗎?

01011010=5AH

0101

1010=5AH

-

0

00000000=00HSUBBA,源操作數(shù);帶借位減法指令2023/2/1383.增量、減量指令:

INC單操作數(shù)

如: INCR2

;R2←R2+1DEC單操作數(shù)

如:DECR2

;R2←R2-1

INCDPTR

;DPTR←DPTR+1 不影響標(biāo)志位狀態(tài)。注意:沒有指令DECDPTR

可用指令DECDPL代替2023/2/1394.乘除指令:

MULAB

;BA←A×B,Cy←0, ;當(dāng)積高字節(jié)B=0,OV←0;B≠0,則OV←1例:A=96(60H),B=192(C0H),執(zhí)行指令MULAB后,

求:A=?B=?Cy=?OV=?P=?解:

96×192=18432(4800H)00H48H01012H0CH000例:A=156(F6H),B=13(0DH),執(zhí)行指令DIVAB后求:A=?B=?Cy=?OV=?P=?解:

156÷13=18(12H),余數(shù)=12(0CH)。思考題:如何實(shí)現(xiàn)多字節(jié)數(shù)據(jù)的乘除運(yùn)算。

DIVAB

;A÷B,A←商,B←余數(shù),Cy←0, ;當(dāng)除數(shù)B=0,OV←1;B≠0,則OV←02023/2/1403.3.3

邏輯運(yùn)算指令一、單操作數(shù)指令(A累加器為操作數(shù)):

1.A清0指令:

CLRA;A←0

2.A取反指令:CPLA;A←A

3、循環(huán)移位指令:1)8位循環(huán)指令:

RLA

;A循環(huán)左移一位rotate

RRA

;A循環(huán)右移一位2)9位循環(huán)指令:

RLCA;帶Cy循環(huán)左移一位

RRCA;帶Cy循環(huán)右移一位2023/2/141例:設(shè)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é)移位:

例:編程將寄存器R6R5中的雙字節(jié)數(shù)X左移一位。2023/2/142二、雙操作數(shù)邏輯運(yùn)算指令(對(duì)位邏輯運(yùn)算):

ANL、ORL、XRL習(xí)題1:如何將累加器A中的數(shù)據(jù)高4位清0,低位不變?

習(xí)題2:如何將寄存器R2中的數(shù)據(jù)奇數(shù)位取反,偶數(shù)位不變?例:A=01××××××B,×表示隨機(jī)狀態(tài),為1或0,下述一組指令執(zhí)行后,A的值如何?

XRLA,#0C0H

;將累加器A的內(nèi)容D7、D6取反

ORLA,#03H ;將累加器A的內(nèi)容D1、D0置1

ANLA,#0E7H

;將累加器A的內(nèi)容D4、D3清0

解:執(zhí)行上述指令后,A=10×00×11B。2023/2/1433.3.4布爾變量操作指令一.位傳送:

MOVC,bit;Cy?(bit)

MOVbit,C;(bit)?Cy例:將位地址20H的一位數(shù)傳送到位地址30H中:

MOVC,20H MOV30H,C二.位清0、置1、取反(CLR、SETB、CPL): CLRC ;Cy?0 CLR40H ;(位地址40H)?0對(duì)片內(nèi)RAM中位尋址區(qū)操作。位累加器Cy和位地址bit。2023/2/144三.邏輯運(yùn)算(ANL、ORL):例:設(shè)Cy=1,(位地址40H)=1,執(zhí)行指令

ANLC,40H后,

Cy=?,(位地址40H)=?位地址表示法:

位地址40H,位寄存器F0

,字節(jié)加位ACC.00習(xí)題:設(shè)累加器A中數(shù)據(jù)為29H=00101001B,Cy=0,執(zhí)行指令 ORLC,0E3H后,Cy=?11ANLC,40H;C←C∧(40H)ANLC,40H;C←C∧(40H)2023/2/145

3.3.5

轉(zhuǎn)移指令

按轉(zhuǎn)移條件分類:1)無條件轉(zhuǎn)移:(LJMP、AJMP、SJMP、JMP)執(zhí)行無條件轉(zhuǎn)移指令,程序無條件轉(zhuǎn)移到指定處。2)條件轉(zhuǎn)移:

指令中給出轉(zhuǎn)移條件,執(zhí)行指令時(shí),先測(cè)試條件:若滿足條件,則程序發(fā)生轉(zhuǎn)移;否則,仍順序執(zhí)行程序。轉(zhuǎn)移指令通過改寫PC的當(dāng)前值,從而改變CPU執(zhí)行程序的順序,使程序發(fā)生跳轉(zhuǎn)。2023/2/146按轉(zhuǎn)移方式分類:1)絕對(duì)轉(zhuǎn)移:指令給出轉(zhuǎn)移目的的絕對(duì)地址d2d1,執(zhí)行指令后,PC?d2d1。2)相對(duì)轉(zhuǎn)移:指令給出轉(zhuǎn)移目的與轉(zhuǎn)移指令的相對(duì)偏移量rel,執(zhí)行指令后,PC?PC

+rel。

目的地址=PC+字節(jié)數(shù)+rel例:

地址 源程序

1000H

LJMP2000H(長(zhǎng)轉(zhuǎn)移)

1003H … …

2000H

;轉(zhuǎn)移目的指令

例:

地址 源程序

1000H

SJMP02(短轉(zhuǎn)移)(2字節(jié))

… 1004H …;轉(zhuǎn)移目的指令2023/2/147一、無條件轉(zhuǎn)移指令:無條件轉(zhuǎn)移:LJMP,AJMP,SJMP,JMP——4條LJMPaddr16長(zhǎng)跳轉(zhuǎn)指令

——可在64KB范圍內(nèi)跳轉(zhuǎn)AJMPaddr11短跳轉(zhuǎn)指令

——可在指令所在的2KB范圍內(nèi)跳轉(zhuǎn)SJMPrel

相對(duì)跳轉(zhuǎn)指令

——可在當(dāng)前PC-128與+127范圍內(nèi)跳轉(zhuǎn)JMP@A+DPTR散轉(zhuǎn)指令

——可在以DPTR為基址+A為偏移量之和所指向的64KB程序范圍內(nèi)跳轉(zhuǎn)2023/2/148

2.短跳轉(zhuǎn)指令:

AJMP

addr11

;PC?PC+2(2個(gè)字節(jié)) ;PC10~0?addr11 PC15~11不變

指令機(jī)器碼:addr11~900001addr8~1指令轉(zhuǎn)移范圍:2KB轉(zhuǎn)移時(shí)要求轉(zhuǎn)移前后保持PC15~11不變。

例:1030HAJMP100H

指令機(jī)器碼:2100H

目的地址為:1100H

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

LJMP addr16(d2d1)

;PC?d2d1

指令機(jī)器碼:

02d2d1

指令轉(zhuǎn)移范圍:64KB2023/2/149相對(duì)偏移量rel

的計(jì)算通式:

rel=[目的地址-(轉(zhuǎn)移指令地址+指令字節(jié)數(shù))]補(bǔ) =[目的地址-

PC當(dāng)前值]補(bǔ)(1)由偏移量rel計(jì)算目的地址;(2)由目的地址計(jì)算偏移量rel。

3.相對(duì)跳轉(zhuǎn)指令:

SJMPrel

;PC?PC+2,PC?PC+rel指令機(jī)器碼:80Hrel

相對(duì)偏移量rel為帶符號(hào)的8位補(bǔ)碼數(shù)。

rel=[目的地址-(源地址+2)]補(bǔ)

rel為正數(shù):向前轉(zhuǎn)移;rel=地址差-2

rel為負(fù)數(shù):向后轉(zhuǎn)移。rel=FEH+地址差指令轉(zhuǎn)移范圍:前128~后127字節(jié)編程時(shí),用標(biāo)號(hào)代替轉(zhuǎn)移目的地址,轉(zhuǎn)移指令的操作數(shù)交給匯編程序計(jì)算。

LJMPNEXT(AJMPNEXT/SJMPNEXT)

NEXT:2023/2/150例2:計(jì)算轉(zhuǎn)移指令的相對(duì)偏移量rel,并判斷是否超出轉(zhuǎn)移范圍?相對(duì)偏移量rel

=2150H-(2130H+2)=001EH=+30D(未超出轉(zhuǎn)移范圍),

rel=1EH求出指令機(jī)器碼:801EH

指令地址 源程序2130H SJMPNEXT …2150HNEXT:MOVA,R2例1:計(jì)算轉(zhuǎn)移指令的目的地址。

(1)835AHSJMP35H解:rel=35H=00110101B為正數(shù),因此程序向前轉(zhuǎn)移。目的地址=(PC)+2+rel=835AH+02H+35H=8391H

(2)835AHSJMP0E7H解:rel=0E7H=11100111B為負(fù)數(shù),因此程序向后轉(zhuǎn)移。目的地址=835AH+02H+0E7H=8343H2023/2/151例3:求原地踏步指令的指令代碼:

HERE:SJMPHERE(或SJMP$)相對(duì)偏移量=[2000H-(2000H+2)]補(bǔ)=FEH,

rel=FEH求出指令代碼為:80FEH習(xí)題:計(jì)算程序中轉(zhuǎn)移指令的相對(duì)偏移量rel,并判斷是否超出轉(zhuǎn)移范圍。

地址 源程序

2130H LOOP:…

21B0H SJMPLOOP

相對(duì)偏移量=[2130H–(21B0H+2)]補(bǔ)=(-130)補(bǔ)

rel已超出轉(zhuǎn)移范圍(-126D~+129D)2023/2/152KEY: MOVDPTR,#KTABMOVA,40HADDA,A

JMP@A+DPTRKTAB: AJMPFUNC0

AJMPFUNC1 …FUNC0:… FUNC1:…

應(yīng)用:處理功能鍵。要求不同功能鍵執(zhí)行不同程序段。設(shè)每個(gè)功能鍵對(duì)應(yīng)一個(gè)鍵值X(0≤X≤FH)。

設(shè)X已存入片內(nèi)RAM的40H單元中。若X=0,則執(zhí)行程序段FUNC0;若X=1,則執(zhí)行程序段FUNC1;

。

4.間接轉(zhuǎn)移指令(多分支轉(zhuǎn)移指令):

JMP@A+DPTR

;PC←((A+DPTR))

指令機(jī)器碼73H,指令轉(zhuǎn)移范圍64KB。2023/2/153二、條件轉(zhuǎn)移指令:A判零轉(zhuǎn)移指令:

JZrel

;PC←PC+2,

;若A=00H,PC←PC+rel(轉(zhuǎn)移),

若A≠00H,PC不變(不轉(zhuǎn)移)條件轉(zhuǎn)移指令形成程序的分支,賦予計(jì)算機(jī)判斷決策能力。

轉(zhuǎn)移條件:1)標(biāo)志位的狀態(tài);2)位地址中的狀態(tài)。JNZrel

;PC←PC+2, ;若A≠00HPC←PC+rel(轉(zhuǎn)移)若A=00H,PC不變(不轉(zhuǎn)移)2.判Cy轉(zhuǎn)移指令:

JCrel

;Cy=1則轉(zhuǎn)移,Cy=0不轉(zhuǎn)移

JNCrel

;Cy=0則轉(zhuǎn)移,Cy=1不轉(zhuǎn)移2023/2/1543.判位轉(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)移5.比較不相等轉(zhuǎn)移指令:

CJNE操作數(shù)1,操作數(shù)2,rel

CJNEA,direct,rel

;PC←PC+3

;若A=(direct),順序執(zhí)行,且Cy=0。

若A≠(direct),則PC←PC+rel+3 且當(dāng)A>(direct),Cy=0,當(dāng)A<(direct),Cy=1。

相當(dāng)于兩個(gè)操作數(shù)相減,僅影響標(biāo)志狀態(tài),不保存結(jié)果。2023/2/155

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

DJNZ操作數(shù),rel

DJNZR2,rel;PC←PC+2,R2←R2-1 ;若R2≠0,PC←(PC)+2+rel, ;若R2=0,PC←(PC)+2。

例:用于循環(huán)結(jié)構(gòu)程序。設(shè)要求程序循環(huán)執(zhí)行100次。

MOVR2,#100 ;設(shè)循環(huán)計(jì)數(shù)器初值LOOP: … ;多次循環(huán)程序段

DJNZR2,LOOP ;循環(huán)控制

;循環(huán)結(jié)束

習(xí)題:當(dāng)循環(huán)計(jì)數(shù)器初值為0,循環(huán)次數(shù)有多少?

例:設(shè)單片機(jī)的晶振頻率為6MHz,編寫一段延時(shí)程序約100ms的子程序。

Delay:MOVR7,#64H ;設(shè)循環(huán)計(jì)數(shù)器初值(100次)LOOP: MOVR6,#0FAH;循環(huán)250次(250×4=1ms)

DJNZR6,$

;循環(huán)控制

DJNZR7,LOOP

RET

T=12/6MHz=2μs

t=2μs+100×(2μs+1ms+2×2μs)+2×2μs=100.606ms

初始化循環(huán)體控制變量的修改循環(huán)次數(shù)的控制

包括2023/2/1563.3.6

子程序調(diào)用和返回指令

子程序調(diào)用和返回指令也使程序發(fā)生轉(zhuǎn)移。一、長(zhǎng)調(diào)用指令:

LCALLaddr16

;PC?PC+3, ;SP?SP+1,(SP)?PC0~7;SP?SP+1,(SP)?PC8~15;P

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論