單片機51系列指令系統與程序設計方法_第1頁
單片機51系列指令系統與程序設計方法_第2頁
單片機51系列指令系統與程序設計方法_第3頁
單片機51系列指令系統與程序設計方法_第4頁
單片機51系列指令系統與程序設計方法_第5頁
已閱讀5頁,還剩61頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

3.1指令格式和偽指令

3.3指令系統

3.4程序設計方法第3章51系列指令系統與程序設計方法單片機原理與應用

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

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

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

2023/2/133.

DB—定義字節型常數指令。

格式:[標號:]DBn1,n2,n3,….nn例:DB12H,100,‘A’作用:定義一個字節常數表4.

DW—定義字型常數指令。格式:[標號:]DW

n1,n2,n3,….nn例:

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

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

格式:符號名EQU表達式(寄存器名)將表達式或一個寄存器名賦給一個符號名。

X1 EQU2000H

X2 EQU0FH

MAIN:MOVDPTR,#X1

ADDA,#X2

6.

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

MOVA,R0

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

A累加器Acc

AB寄存器對

direct直接地址00H~0FFH#data立即數,表示一個常數

00H~0FFH

@間接尋址標記X寄存器名(X)X寄存器內容((X))由X寄存器尋址的存儲器單元內容$本條指令起始地址rel

相對偏移量-128~+127rrr

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

還有相對尋址等。

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

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

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

指令操作數是存儲器單元地址,數據放在存儲器單元中。

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

78H40H

56H

例:設存儲器兩個單元的內容如圖所示,執行指令MOVA,40H后A=?思考題:

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

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

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

41H 67H

40H34HR0→A20HR040H例:

MOVA,R0 ;A?(R0)

設指令執行前A=20H,R0=40H,

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

例:

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

89H2009H

12H

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

數據地址=基地址+偏移量。

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

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

MOVCA,@A+PC

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

MOVC,40H ;CY(位地址40H)設指令執行前CY=1,位地址40H存儲器單元如圖,執行指令后,CY=?29H0110001028H11010110位尋址區06.位尋址方式(可歸屬于直接尋址):2023/2/1137.相對尋址方式:目的地址=轉移指令地址+轉移指令字節數+rel

(rel為偏移量)

當前PC值加上指令中規定的偏移量rel,構成實際的操作數地址例:

SJMPrel

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

3.3指令系統單片機所能執行的各種指令的集合稱為它的指令系統

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

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

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

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

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

3.3.1數據傳送指令 最基本和最重要的指令類,可實現寄存器、存儲器之間的數據傳送。 一、內部傳送指令: 片內數據存儲器數據傳送。二、外部傳送指令: 片外數據存儲器數據傳送。 三、交換指令: 片內數據存儲器數據傳送。四、堆棧操作指令: 片內數據存儲器數據傳送。五、查表指令: 程序存儲器數據傳送。2023/2/116(一)內部傳送指令:習題:找出配對指令,實現反向傳送。指令機器碼: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

實現片內數據存儲器中數據傳送。指令格式:

MOV

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

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

(×)

解:MOVA,60H

(√)

結果A=32H順序執行下列指令序列,求每一步執行結果。2023/2/118說明:只有指令表中的指令才有對應指令代碼,計算機才能執行。編程時,不能隨意創造發明指令。1.一條指令中不能同時出現兩個工作寄存器:

非法指令: MOVR1,R2

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

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

非法指令:MOVR0,#80H

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

指令格式:MOVX

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

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

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

MOVX A,@Ri

;A←((P2Ri))

(讀) MOVX @Ri,A

;(P2Ri)←A(寫)實現片外數據存儲器和A累加器之間的數據傳送。

2023/2/120例:實現片外數據存儲器數據傳送(2000H)?(2100H)。

MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A習題:將片外RAM0000H單元的數據傳送到片內RAM的60H單元。

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

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

1.DPTR為基址寄存器:

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

程序存儲器任意空間,稱為遠程查表指令。2.PC為基址寄存器:

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

常數表只能在查表指令后256B范圍內,稱為近程查表指令。實現從程序存儲器讀取數據到A累加器,只能使用變址間接尋址方式。

多用于查常數表程序,可直接求取常數表中的函數值。2023/2/122例1:以查表方法把累加器中的十六進制數轉換為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(結果) RET ;子程序結束 … ;其它程序段

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

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

源程序

ORG1000H ;程序起始地址 1000H SQU: MOVA,20H ;取X 1002H ADDA,#3

;修正偏移量 1004H MOVCA,@A+PC

;查表求Y=X2(PC=1005H)

1005H MOV21H,A

;存結果

1007H RET

;子程序結束

1008H TAB: DB00,01,04… ;平方表

100BH DB09,…,225 方法2:查表法求Y=X2。設X(0≤X≤15)在片內RAM的20H單元中,要求查表求Y,存入片內RAM21H單元。例2:2023/2/125(四)交換指令:

1.字節交換指令

XCHA,Rn

;A?(Rn)

XCHA,@Ri

;A?((Ri))

XCHA,direct

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

←對嗎?29H不對!!實現片內RAM區的數據雙向傳送。2023/2/1262.半字節交換指令:XCHDA,@Ri;A0~3

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

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

例:設

A=02H,B=56H,執行下列指令后,SP=?,A=?,B=?SBR:MOVSP,#30H;設棧底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練習:

說明程序執行過程中,SP的內容及堆棧中內容的改變過程。

程序如下:

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習題:找出指令錯誤并改正:1.MOVA,#1000H;A←1000H(A裝1個字節數)2.MOVXA,1000H;A←(1000H)片外RAM(DPTR、Ri)3.MOVCA,1000H;A←(1000H)片外ROM(DPTR、PC)4.MOVX60H,A ;片外RAM(60H)←A(應為MOV)5.MOVR0,60H;片內RAM:(61H)←(60H) MOV61H,@R0

(片內RAM可直接尋址)

6.XCHR1,R2 ;R1?R2(必須有A參加)7.MOVXDPTR,#2000H;DPTR←2000H(應為MOV)8.MOVX60H,@DPTR ;片內RAM←片外RAM(必須有A參加)2023/2/1303.3.2 算術運算指令與數據傳送指令不同,多數算術運算指令會影響標志位的狀態,即CPU執行算術運算指令后,根據數據操作情況自動設置標志位的狀態。

MCS-51的程序狀態字寄存器PSW

為標志寄存器。其格式如下:字節地址為D0H位序B7B6B5B4B3B2B1B0位符號CYACF0RS1RS0OVF1P2023/2/1311.標志位(自動設置狀態):1)CY:進位標志位(B7) 保存運算后最高位的進位/借位狀態,當有進位/借位,CY=1,否則Cy=0。2)AC:輔助進位標志位(B6) 保存低半字節的進位/借位狀態,當D3產生進位/借位,AC=1,否則AC=0。用于十進制調整。3)OV:溢出標志位(B2)

OV=Cy7?Cy6,補碼運算產生溢出OV=1,否則OV=0。4)P:奇偶標志位(B0) 反映累加器A中數據的奇偶性。當1的個數為奇數,P=1,否則P=0。2023/2/1322.用戶選擇位(編程設置狀態)1)F0、F1:用戶自定義標志位。

2)RS1、RS0

工作寄存器區選擇位。

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

00111011=3BH

+00111011=3BH

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

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

ADDA,#3BH后求:A=?Cy=?OV=?AC=?P=? PSW=?01000001=41H完成片內RAM和A中數據的加減乘除運算。位序B7B6B5B4B3B2B1B0位符號CYACF0RS1RS0OVF1P2023/2/134

10011010=9AH

11100011=E3H+

0

1

01111101=7DH

2)帶進位加法:

ADDCA,源操作數

如:ADDCA,R2

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

例:A=9AH,R2=E3H,PSW=0,執行指令

ADDCA,R2

后求:

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

ADDA,源操作數 DAA帶進位十進制加1法指令:

ADDCA,源操作數 DAA作業:BCD碼加法編程。 設X、Y為4位壓縮BCD碼,求Z=X+Y。BCD調整指令:BCD:Binary-Coded-Decimal(二進制編碼的十進制)DAA ;把A中按二進制相加后的結果調整成按BCD數相加的結果調整原因:1、相加結果大于9,進入無效編碼區;2、相加結果有進位,跳過無效編碼區。調整方法:進行加“6”修正。2023/2/1372.減法指令:

如:SUBBA,R2

;A←A-R2-Cy, ;影響Cy、OV、AC、P000000習題:編程求雙字節減法。設X、Y存在片內RAM60H起始單元,計算

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

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

01011010=5AH

0101

1010=5AH

-

0

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

INC單操作數

如: INCR2

;R2←R2+1DEC單操作數

如:DECR2

;R2←R2-1

INCDPTR

;DPTR←DPTR+1 不影響標志位狀態。注意:沒有指令DECDPTR

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

MULAB

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

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

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

156÷13=18(12H),余數=12(0CH)。思考題:如何實現多字節數據的乘除運算。

DIVAB

;A÷B,A←商,B←余數,Cy←0, ;當除數B=0,OV←1;B≠0,則OV←02023/2/1403.3.3

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

1.A清0指令:

CLRA;A←0

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

3、循環移位指令:1)8位循環指令:

RLA

;A循環左移一位rotate

RRA

;A循環右移一位2)9位循環指令:

RLCA;帶Cy循環左移一位

RRCA;帶Cy循環右移一位2023/2/141例:設A=11000101B,Cy=0,分別執行下列單條指令:

CPLA

求:A=?Cy=?

RLA求:A=?Cy=?

RLCA

求:A=?Cy=?

001110100100010110100010101CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A0CyR6R5Cy;Cy=0,設R6=55H,R5=AAH;R6=01010101B,R5=10101010B,Cy=0;R6=01010101B,R5=01010100B,Cy=1;R6=10101011B,R5=01010100B,Cy=0思考題:如何將寄存器R6R5中的雙字節數X右移一位。用9位循環指令實現多字節移位:

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

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

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

XRLA,#0C0H

;將累加器A的內容D7、D6取反

ORLA,#03H ;將累加器A的內容D1、D0置1

ANLA,#0E7H

;將累加器A的內容D4、D3清0

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

MOVC,bit;Cy?(bit)

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

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

ANLC,40H后,

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

位地址40H,位寄存器F0

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

3.3.5

轉移指令

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

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

+rel。

目的地址=PC+字節數+rel例:

地址 源程序

1000H

LJMP2000H(長轉移)

1003H … …

2000H

;轉移目的指令

例:

地址 源程序

1000H

SJMP02(短轉移)(2字節)

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

——可在64KB范圍內跳轉AJMPaddr11短跳轉指令

——可在指令所在的2KB范圍內跳轉SJMPrel

相對跳轉指令

——可在當前PC-128與+127范圍內跳轉JMP@A+DPTR散轉指令

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

2.短跳轉指令:

AJMP

addr11

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

指令機器碼:addr11~900001addr8~1指令轉移范圍:2KB轉移時要求轉移前后保持PC15~11不變。

例:1030HAJMP100H

指令機器碼:2100H

目的地址為:1100H

1.長轉移指令:

LJMP addr16(d2d1)

;PC?d2d1

指令機器碼:

02d2d1

指令轉移范圍:64KB2023/2/149相對偏移量rel

的計算通式:

rel=[目的地址-(轉移指令地址+指令字節數)]補 =[目的地址-

PC當前值]補(1)由偏移量rel計算目的地址;(2)由目的地址計算偏移量rel。

3.相對跳轉指令:

SJMPrel

;PC?PC+2,PC?PC+rel指令機器碼:80Hrel

相對偏移量rel為帶符號的8位補碼數。

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

rel為正數:向前轉移;rel=地址差-2

rel為負數:向后轉移。rel=FEH+地址差指令轉移范圍:前128~后127字節編程時,用標號代替轉移目的地址,轉移指令的操作數交給匯編程序計算。

LJMPNEXT(AJMPNEXT/SJMPNEXT)

NEXT:2023/2/150例2:計算轉移指令的相對偏移量rel,并判斷是否超出轉移范圍?相對偏移量rel

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

rel=1EH求出指令機器碼:801EH

指令地址 源程序2130H SJMPNEXT …2150HNEXT:MOVA,R2例1:計算轉移指令的目的地址。

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

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

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

rel=FEH求出指令代碼為:80FEH習題:計算程序中轉移指令的相對偏移量rel,并判斷是否超出轉移范圍。

地址 源程序

2130H LOOP:…

21B0H SJMPLOOP

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

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

JMP@A+DPTRKTAB: AJMPFUNC0

AJMPFUNC1 …FUNC0:… FUNC1:…

應用:處理功能鍵。要求不同功能鍵執行不同程序段。設每個功能鍵對應一個鍵值X(0≤X≤FH)。

設X已存入片內RAM的40H單元中。若X=0,則執行程序段FUNC0;若X=1,則執行程序段FUNC1;

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

JMP@A+DPTR

;PC←((A+DPTR))

指令機器碼73H,指令轉移范圍64KB。2023/2/153二、條件轉移指令:A判零轉移指令:

JZrel

;PC←PC+2,

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

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

轉移條件:1)標志位的狀態;2)位地址中的狀態。JNZrel

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

JCrel

;Cy=1則轉移,Cy=0不轉移

JNCrel

;Cy=0則轉移,Cy=1不轉移2023/2/1543.判位轉移指令:

JBbit,rel

;(bit)=1轉移,否則不轉移

JNBbit,rel

;(bit)=0轉移,否則不轉移4.判位清0轉移指令:

JBCbit,rel

;(bit)=1轉移,且(bit)=0,否則不轉移5.比較不相等轉移指令:

CJNE操作數1,操作數2,rel

CJNEA,direct,rel

;PC←PC+3

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

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

相當于兩個操作數相減,僅影響標志狀態,不保存結果。2023/2/155

6.循環轉移指令:

DJNZ操作數,rel

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

例:用于循環結構程序。設要求程序循環執行100次。

MOVR2,#100 ;設循環計數器初值LOOP: … ;多次循環程序段

DJNZR2,LOOP ;循環控制

;循環結束

習題:當循環計數器初值為0,循環次數有多少?

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

Delay:MOVR7,#64H ;設循環計數器初值(100次)LOOP: MOVR6,#0FAH;循環250次(250×4=1ms)

DJNZR6,$

;循環控制

DJNZR7,LOOP

RET

T=12/6MHz=2μs

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

初始化循環體控制變量的修改循環次數的控制

包括2023/2/1563.3.6

子程序調用和返回指令

子程序調用和返回指令也使程序發生轉移。一、長調用指令:

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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論