MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計課件_第1頁
MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計課件_第2頁
MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計課件_第3頁
MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計課件_第4頁
MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計課件_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

主要內容尋址方式指令系統(tǒng)傳送與交換指令算術運算、邏輯運算指令控制轉移指令位操作指令偽指令程序設計舉例第3章MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計docin/sundae_meng主要內容第3章MCS-51系列單片機的指令系統(tǒng)及匯編語言

計算機通過執(zhí)行程序完成人們指定的任務,程序由一條一條指令構成,能為CPU識別并執(zhí)行的指令的集合就是該CPU的指令系統(tǒng)。

MCS-51單片機匯編語言指令格式:

操作符目的操作數(shù),源操作數(shù)操作符指明該指令完成什么操作;操作數(shù)是指明該指令的操作對象。目的操作數(shù)是存放結果的。指令中操作數(shù)提供的方式稱為尋址方式。docin/sundae_meng計算機通過執(zhí)行程序完成人們指定的任務,程序由一條一條

指令中的常用符號Rn:

表示當前工作寄存器R0~R7中的一個。Ri:

代表R0和R1寄存器中的一個,用作間接尋址寄存器。dir:8位直接字節(jié)地址(片內RAM和SFR)#data:8位立即數(shù),即8位常數(shù)??梢詾?進制(B)、10進制、16進制(H)、字符(‘

’)#data16:

表示16位立即數(shù),即16位常數(shù),取值范圍為:#0000H~#0FFFFHaddr16:

表示16位地址addr11:

表示11位地址rel:

相對偏移量(為一字節(jié)補碼)用于相對轉移指令中bit:

位地址,在位地址空間中。 $:表示當前指令的地址。docin/sundae_meng 指令

指令中直接給出操作數(shù)的尋址方式。在51系列單片機的指令系統(tǒng)中,立即數(shù)用一個前面加“#”號的8位數(shù)(#data,如#30H)或16位數(shù)(#data16,如#2052H)表示。立即尋址中的數(shù),稱為立即數(shù)。例如指令:MOVA,#58H;58H→A3.1尋址方式

3.1.1立即尋址docin/sundae_meng 指令中直接給出操作數(shù)的尋址方式。在51系列單片機的

操作數(shù)的地址直接出現(xiàn)在指令中。 尋址對象:①內部數(shù)據(jù)存貯器:使用它的地址。②特殊功能寄存器:既可使用它的地址,也可以直接使用寄存器名。③位地址空間④程序存儲器空間例:MOVA,40H;(40H)→AMOV40H,41H;(41H)→(40H)

MOVP0,#45H;

45H→P0MOV80H,#45H;

45H→P0MOVC,18H;

位地址18H→C3.1.2直接尋址docin/sundae_meng操作數(shù)的地址直接出現(xiàn)在指令中。 3.1.2直接尋址d

操作數(shù)存放在寄存器中。尋址對象:A,B,C,DPTR,R0~R7。

B僅在乘除法指令中為寄存器尋址,在其他指令中為直接尋址。

A可以寄存器尋址又可以直接尋址,直接尋址時寫作ACC

例如:MOVA,R0;R0→AMULAB;A*B→BAADDA,ACC;A+A→A3.1.3寄存器尋址docin/sundae_meng 操作數(shù)存放在寄存器中。3.1.3寄存器尋址docin/s

操作數(shù)存放在以寄存器內容為地址的單元中,用做間址的寄存器為Ri(i=0,1)、DPTR。

①對片內的間接尋址用Ri(i=0,1)如:MOVR0,#20H

MOVR0,A;A→(20H)

②對片外的間接尋址可用Ri(i=0,1)或DPTR

如:MOVXDPTR,A;A→以DPTR的內容為地址的外部RAM中

MOVXR1,A;A→以P2R1內容為地址的外部RAM中③PUSH和POP指令的源操作數(shù)是以SP間接尋址注意:寄存器間接尋址不能訪問SFRMOVR1,#81HMOVA,R1;不能訪問SP,只能用MOVA,SP3.1.4寄存器間址docin/sundae_meng 操作數(shù)存放在以寄存器內容為地址的單元中,用做間址的

變址尋址只能訪問程序存儲器。操作數(shù)所在位置的地址由DPTR或PC寄存器與A的內容相加后形成。其中累加器A內容是可變的。變址尋址只有三條指令。

MOVCA,A+DPTR;(A+DPTR)→AMOVCA,A+PC;(A+PC)→AJMP

A+DPTR;A+DPTR→PC注意:①A的內容是無符號數(shù)。②PC值是指令的當前PC值,即下條指令的PC值3.1.5變址尋址docin/sundae_meng 變址尋址只能訪問程序存儲器。操作數(shù)所在位置的地址由3.1.6相對尋址

變址尋址只能訪問程序存儲器。相對尋址是將程序計數(shù)器PC的當前值與指令第二字節(jié)給出的偏移量相加,從而形成轉移的目標地址。

如:JZ61H注意:①相對偏移量是一字節(jié)有符號數(shù),用補碼表示,偏移范圍是:-128~+127。②PC值是指令的當前PC值,即下條指令的PC值。③源程序中偏移量常用符號地址表示。docin/sundae_meng3.1.6相對尋址變址尋址只能訪問程序存儲器

對可位尋址的位地址尋址。包括片內RAM的位地址空間和可位尋址的SFR(地址能被8整除) 如:MOVC,20H

;位尋址

MOVA,20H

;字節(jié)尋址以上兩條指令究竟是位尋址還是字節(jié)尋址,根據(jù)兩操作數(shù)類型一致的原則,由另一個操作數(shù)決定。

3.1.7

位尋址docin/sundae_meng對可位尋址的位地址尋址。包括片內RAM的位地址空立即尋址直接尋址寄存器尋址寄存器間接尋址變址尋址相對尋址位尋址片內RAM低128B單元√√工作寄存器組R0~R7√√√特殊功能寄存器SFRA、B、DPTR、C√√√程序存儲器√√√√片外RAM√位地址空間√√尋址方式與存儲空間的對應關系

docin/sundae_meng立即直接寄存器寄存器變址相對位尋址片內RAM√√工作寄存器組

dirRi

Rn#dataAMOVA, Rn

#datadir

RiMOVdir, ARn,Ri

#data

dir

MOVRi, A

dir

#data內部RAM、SFR之間的傳送MOV指令MOVRn,

Adir

#data3.2指令系統(tǒng)

3.2.1數(shù)據(jù)傳送與交換指令docin/sundae_mengdirRiRn#dataAMOVA, 例R1=20H,(20H)=55H,

MOVA,R1執(zhí)行后,A=55H。例(40H)=30H,

MOVR7,40H執(zhí)行后,R7=30H。例MOVR7,#40H執(zhí)行后,R7=40H。注意:寄存器之間無傳送;寄存器間址和寄存器之間無傳送;立即數(shù)不能做目標地址;docin/sundae_meng例R1=20H,(20H)=55H,注意:docin/sRi,ADPTR,AA,RiA,DPTRMOVXMOVCA,A+PCA,A+DPTR2.外部存儲器和A累加器之間的傳送MOVXA

外部數(shù)據(jù)存儲器程序存儲器MOVCdocin/sundae_mengRi,ADPTR,AMOVXMOVCA,

利用MOVX實現(xiàn)片外數(shù)據(jù)存儲器數(shù)據(jù)傳送

(2000H)→(2100H)

MOVDPTR,#2000H MOVXA,DPTR MOVDPTR,#2100H MOVXDPTR,A

;DPTR=2000H

;DPTR=2100H;A←X

;(2100H)←Xx片外數(shù)據(jù)存儲器不能直接尋址。下列為非法指令:

MOVXA,2000H×MOVX2100H,2000H×docin/sundae_meng利用MOVX實現(xiàn)片外數(shù)據(jù)存儲器數(shù)據(jù)傳送

利用Ri間址來實現(xiàn)將(2000H)→(2100H)MOVP2,#20H ;高位地址

MOVR0,#00 ;低位地址

MOVXA,R0 ;讀片外RAMMOVP2,#21H ;改變高位地址

MOVXR0,A ;寫片外RAMdocin/sundae_meng利用Ri間址來實現(xiàn)將(2000H)→(21

利用MOVC指令實現(xiàn)查表功能

注:①只能從程序存儲器讀取數(shù)據(jù)到A累加器。

②只能使用變址間接尋址方式

1)DPTR為基址寄存器

MOVCA,A+DPTR;A←(A+DPTR)

查表范圍為64KB程序存儲器任意空間。2)PC為基址寄存器

MOVCA,A+PC ;A←(A+PC)

常數(shù)表只能在查表指令后256B范圍內。docin/sundae_meng利用MOVC指令實現(xiàn)查表功能

例查表法求Y=X2。設X(0≤X≤15)在片內RAM20H單元,要求將查表求Y,存入片內RAM21H單元1)用DPTR作基址寄存器

ORG0100H SQU: MOVDPTR,#TAB ;確定表首地址

MOVA,20H ;取X

MOVCA,A+DPTR;查表求Y=X2

MOV21H,A ;保存Y RET ;子程序結束

… ;其它程序段

ORG0200H ;常數(shù)表格首地址TAB: DB00,01,04,09,…,225;平方表docin/sundae_meng例查表法求Y=X2。設X(0≤X≤15)在片內R

指令地址

源程序

ORG0100H ;程序起始地址

0100H SQU:MOVA,20H ;取X 0102H ADDA,#3 ;修正偏移量

0104H MOVCA,A+PC;查表求Y=X2 0105H MOV21H,A ;存結果

0107H RET ;子程序結束

0108H TAB:DB00,01,04 ;平方表

010BH DB09,…,225 思考題:當0≤X≤255時,如何用查表法編程求Y=X22)用PC作基址寄存器docin/sundae_meng指令地址 源程序思考題:當0≤3.交換指令

實現(xiàn)片內RAM區(qū)的數(shù)據(jù)雙向傳送1)字節(jié)交換指令

XCHA,Rn;A←→Rn XCHA,Ri;A←→(Ri)XCHA,dir;A←→(dir)2)半字節(jié)交換指令

XCHDA,Ri;A0~3←→(Ri)0~3SWAPA ;A4~7←→A0~3

dirRi

RnA4.堆棧操作指令

入棧指令:PUSHdir;SP←SP+1,(SP)←(dir)

出棧指令:POPdir;(dir)←(SP),SP←SP-1

RiA7~47~43~03~0A7~43~0docin/sundae_meng3.交換指令 dirRiRnAdirRiRn#dataA

dirRi

Rn#dataAA,Rn,Ri

#datadirADDADDCSUBBANLORLXRL加進位加借位減與或異或1.以A為目的操作數(shù)的算術、邏輯運算指令(24條)3.2.2算術運算和邏輯運算指令docin/sundae_mengdirRiRn#dataAdirRiRn#d2.以dir為目的操作數(shù)邏輯運算指令(6條)A#data

dir與ANL或ORL異或XRLdir,#dataA3.加1、減1指令RiAdirRnDPTRINCRiAdirRnDECdocin/sundae_meng2.以dir為目的操作數(shù)邏輯運算指令(6條)A#data4.十進制調整指令

DAA;僅對存于A中的加法結果進行十進制調整

若需完成十進制減法運算,則應變減法運算為補碼的加法運算即可,其減數(shù)X的補碼通過(99-X)+1再DAA后得到。

原則:和低4位大于9或有半進位,則低4位加6

和高4位大于9或有進位,則高4位加6例:(DATA)-(DATA+1)=>(DATA+2)Y-X=Y-X+100-->有效位為2位十進制,模為100=Y+(99-X)+1docin/sundae_meng4.十進制調整指令若需5.乘、除法指令MUL AB;A×B→BADIV AB;A÷B→商在A中,余數(shù)在B中6.專對A的指令CPL ACLR A;0→A;A→AMOVA,#99HDAACLRCADDA,DATASUBBA,DATA+1DAAADDA,#1MOVDATA+2,Adocin/sundae_meng5.乘、除法指令MUL AB;A×B→BADIV CYRRARLARLCARRCA移位指令(僅對A)00101101A01001011ACY11001011A000101101A1CY10010110A設1CYCYdocin/sundae_mengCYRRARLARLCARRCA移位1.調用程序和返回類指令

1)長調用

LCALLaddr16;addr16→PC0~15

指令功能同80X86中的CALL,調用范圍64KB全部空間,指令的機器碼為三字節(jié)。

2)短調用

ACALLaddr11;addr11→PC0~10

指令的功能同前,主要區(qū)別為:

addr11→PC0~10,而PC11~15保持原值不變,故其調用范圍為2KB,即子程序入口距當前PC不得超過2KB地址范圍。本指令的機器碼為二字節(jié)。3.2.3控制轉移類指令docin/sundae_meng1.調用程序和返回類指令3.2.3控制轉移類指令d3)子程序返回指令(從棧頂彈出斷點到PC)

RET;從調用子程序返回。

RETI;從中斷服務程序返回并恢復中斷優(yōu)先級狀態(tài)觸發(fā)器。2.轉移指令

1)無條件轉移指令(1)短轉移

AJMPaddr11;addr11→PC0~10

轉移范圍:2KB機器碼為2字節(jié)docin/sundae_meng3)子程序返回指令(從棧頂彈出斷點到PC)docin/s(2)長轉移

LJMPaddr16;addr16→PC0~15

轉移范圍:64KB機器碼為3字節(jié)。(3)間接轉移

JMPA+DPTR;A+DPTR→PC

分析下列程序段,說出當A分別為0和2時,程序轉置何處?該程序段的功能是什么?

MOVDPTR,#TABLEJMPA+DPTRTABLE:AJMPPROC0AJMPPROC1AJMPPROC2AJMPPROC3docin/sundae_meng(2)長轉移docin/sundae_meng

(4)無條件相對轉移

SJMPrel;PC+rel→PC,即As+2+rel→PC,機器碼為2字節(jié)

As為源地址(本指令的首地址),執(zhí)行本指令時當前PC=As+2,rel為轉移的偏移量,轉移可以向前轉(目的地址小于源地址),也可以向后轉(目的地址大于源地址),因此偏移量rel是1字節(jié)有符號數(shù),用補碼表示(-128~+127),所以指令轉移范圍在離源地址As的-126~+129字節(jié)之間。docin/sundae_meng(4)無條件相對轉移docin/sundae_meng2)條件轉移指令(1)累加器為零(非零)轉移

JZ/JNZrel;A=0/(A≠0)則轉移,否則順序執(zhí)行程序(2)減1不等于零轉移

DJNZRn/dir,rel

功能為:Rn(dir)-1→Rn(dir)

相減結果≠0轉,否則順序執(zhí)行程序docin/sundae_meng2)條件轉移指令docin/sundae_meng

(3)比較轉移指令

CJNEA,dir,relCJNEA,#data,relCJNERn,#data,relCJNERi,#data,rel操作數(shù)1不等于操作數(shù)2則轉,否則順序執(zhí)行。1例:Y=-1X≥ZX<Z

Z

X

YDATA+2DATA+1DATAMOVDATA+2,#0FFHMOVA,DATACJNEA,DATA+1,NEXTNEXT:JCNEXT1MOVDATA+2,#1NEXT1:RETdirRiRn#dataAdocin/sundae_meng(3)比較轉移指令操作數(shù)1不等于操作數(shù)2則轉,否則順序1.位傳送指令

MOVC,bit;(bit)→CYMOVbit,C;CY→bit2.位狀態(tài)控制指令

CLRC;0→CY

CLRbit;0→bitSETBC;1→CYSETBbit;1→bitCPLC;CY→CYCPLbit;bit→bit3.2.4位操作指令docin/sundae_meng1.位傳送指令3.2.4位操作指令docin/sund3.位邏輯運算指令

ANLC,bit;CY∧(bit)→CY

ANLC,/bit;CY∧(bit)→CY

ORLC,bit;CY∨(bit)→CY

ORLC,/bit;CY∨(bit)→CYdocin/sundae_meng3.位邏輯運算指令

ANLC,bit;CY

4.位轉移 位轉移根據(jù)位的值決定轉移,均為相對轉移指令。

JCrel;CY=1,則轉移,否則順序執(zhí)行程序

JNCrel;CY=0,則轉移,否則順序執(zhí)行程序

JBbit,rel;(bit)=1,則轉移,否則順序執(zhí)行程序

JNBbit,rel;(bit)=0,則轉移,否則順序執(zhí)行程序

JBCbit,rel;(bit)=1,則轉移,且該位清零,否則順序執(zhí)行程序docin/sundae_meng 4.位轉移docin/sundae_meng1.定義:匯編控制指令,沒有指令代碼,不能被CPU執(zhí)行,只用于匯編過程,為匯編程序提供匯編信息。2.常用偽指令(1)ORGORG是設置起始地址偽指令,其格式是:

ORG 16位地址或標號(2)ENDEND是結束匯編偽指令,其格式是:

END(3)DB DB是定義字節(jié)偽指令,其格式是:

[標號:]DB字節(jié)型數(shù)表(4)DW DW是定義字偽指令,其格式是:

[標號:] DW字型數(shù)表3.3偽指令docin/sundae_meng1.定義:3.3偽指令docin/sundae_meng(5)DS DS是定義存儲空間偽指令,其格式是:

[標號:] DS表達式(6)EQU EQU是賦值偽指令,其格式是: 字符名稱 EQU 數(shù)據(jù)或匯編符號(7)DATA DATA是數(shù)據(jù)地址賦值偽指令,其格式是: 字符名稱 DATA 表達式(8)BIT BIT是位地址賦值偽指令,其格式是: 字符名稱 BIT 位地址

詳見表3.3MCS-51中的偽指令docin/sundae_meng(5)DSdocin/sundae_meng進制間的轉換1.十進制→二進制(整數(shù))任何十進制數(shù)D有:D=dn-1×10n-1+dn-2×10n-2+…

+d1×101+d0×100

=(…(dn-1×10+dn-2)×10

+…

+d1)×10+d0規(guī)律:di×10+di-1(i=1,2,…n-1)按二進制運算規(guī)則運算則得二進制數(shù)3.4程序設計舉例docin/sundae_meng進制間的轉換1.十進制→二進制(整數(shù))任何十進制數(shù)D有:規(guī)律例:將4位十進制數(shù)D3D2D1D0轉換成二進制數(shù),設4位十進制數(shù)D3D2D1D0按分離BCD碼形式存放,要求結果的高位存放在R3中,結果的低位存放在R2中。方法:D3D2D1D0=(((0×10+D3)×10+D2)×10+D1)×10+D0結果:16位二進制數(shù)0D30D20D10D0DATAdocin/sundae_meng例:將4位十進制數(shù)D3D2D1D0轉換成二進制數(shù),設4位方法流程:設置指針指向DATA計數(shù)器初始(R7=3)Di初始→結果單元結果單元內容×10+Di-1→結果單元修改指針計數(shù)器-1→計數(shù)器↓↓↓↓↓↓計數(shù)器=0?↓返回YNdocin/sundae_meng流程:設置指針指向DATA計數(shù)器初始(R7=3)Di初始→結×R3R2R2×0AHR3×0AH0A000R3R2MOV A,R2MOV B,#0AHMUL ABMOV R2,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ARETMUL10:結果單元乘10子程序由于4位10進制(9999)小于16位2進制(65535),所以轉換結果不會大于16位docin/sundae_meng×R3R2R2×0AHR3×0AH0A000R3R2MOV MOV R0,#DATAMOV R7,#03HMOV A,R0MOV R2,AMOV R3,#0ACALLMUL10INC R0MOV A,R0ADD A,R2MOV R2,AMOV A,R3ADDC A,#0MOV R3,ADJNZ R7,BCDB1RETBCDB:BCDB1:0D30D20D10D0DATAdocin/sundae_mengMOV R0,#DATAMOV A,2.十進制→二進制(小數(shù))10進制乘2取整(取溢出)例:0.625=2-1+2-3

=

0.10100000Ba.小數(shù)點位數(shù)由乘2次數(shù)定,結果單元字節(jié)數(shù)也由此定b.第一次的整數(shù)權最高=2-1c.乘2是10進制的乘2,自身相加再DAA調整D

=b-1×2-1+b-2×2-2+…+b-m×2-m

docin/sundae_meng2.十進制→二進制(小數(shù))10進制乘2取整(取溢出)例:0例:設入口時10進制數(shù)在A中,要求結果放在R2中(8位二進制小數(shù))結果單元清0次數(shù)計數(shù)器初始十進制小數(shù)單元乘2整數(shù)移入結果單元計數(shù)器-1→計數(shù)器↓↓↓↓↓計數(shù)器=0?↓返回YNBCDBP:MOV R2,#0 MOV R6,#8BCDBP1:ADDA,ACC DAA XCH A,R2 RLC A XCH A,R2 DJNZR6,BCDBP1 RET;結果單元清0;次數(shù)初始;10×2;將整數(shù)移入結果單元溢出在進位位中docin/sundae_meng例:設入口時10進制數(shù)在A中,要求結果放在R2中(8位二進制3.二進制→十進制(整數(shù))按權展開以8位為例:b7b6b5b4b3b2b1b0=b7×27+b6×26+…+b0×20

=(…((0×2+b7)×2+b6)×2+…)×2+b0將二進制數(shù)逐步左移得:b7,b6,b5,b4,b3,b2,b1,b0結果單元字節(jié)數(shù):二進制1字節(jié)(≤255)十進制2字節(jié)二進制2字節(jié)(≤65535)十進制3字節(jié)注:這里的乘2為10進制乘2按十進制運算規(guī)則運算則得十進制數(shù)docin/sundae_meng3.二進制→十進制(整數(shù))按權展開以8位為例:將二進制數(shù)逐結果單元清零次數(shù)計數(shù)器初始清Cy二進制數(shù)左移一位到Cy結果單元×2+Cy↓↓↓↓↓計數(shù)器=0?↓返回YN計數(shù)器-1↓例:被轉換數(shù)在R3中,結果在R4R5中IBTD:CLR A MOV R4,A MOV R5,AMOV R7,#8IBTL2:CLR CMOVA,R3RLCA MOVR3,AMOVA,R5ADDCA,R5DAA MOVR5,AMOVA,R4ADDCA,R4DA A MOVR4,A DJNZR7,IBTL2 RETdocin/sundae_meng結果單元清零次數(shù)計數(shù)器初始清Cy二進制數(shù)左移一位到Cy結果單4.二進制→十進制(小數(shù))二進制乘10取整(取溢出)0.75D→

0.11000000B

×

1010B111.10000000B×

1010B101.00000000B例:8位二進制小數(shù)→4位十進制小數(shù)結果位數(shù)可自定例:設8位二進制小數(shù)在A中,結果放在以DATA為首地址的4個單元中,存放格式如下,試編程實現(xiàn).0D-10D-20D-30D-4DATAB=d-1×10-1+d-2×10-2

+…

+d-m×10-mdocin/sundae_meng4.二進制→十進制(小數(shù))二進制乘10取整(取溢出)0.7指針R1指向結果最高字節(jié)DATA位計數(shù)器初始二進制小數(shù)乘10取溢出存入結果單元修改結果指針↓↓↓↓↓已經(jīng)4位?↓返回YNBBCDP:MOV R1,#DATA MOV R7,#4BBCDP1:MOVB,#0AH MULAB MOV R1,B INC R1 DJNZR7,BBCDP1 RETdocin/sundae_meng指針R1指向結果最高字節(jié)DATA位計數(shù)器初始二進制小數(shù)乘10(1)51系列單片機指令系統(tǒng)的特點是不同的存儲空間尋址方式不同,適用的指令不同,必須進行區(qū)分。(2)指令是程序設計的基礎,應重點掌握傳送指令、算術運算指令、邏輯運算指令、控制轉移指令和位操作指令,掌握指令的功能,操作的對象和結果,對標志位的影響,應要求熟記。小結docin/sundae_meng(1)51系列單片機指令系統(tǒng)的特點是不同的存儲空間尋址方式不主要內容尋址方式指令系統(tǒng)傳送與交換指令算術運算、邏輯運算指令控制轉移指令位操作指令偽指令程序設計舉例第3章MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設計docin/sundae_meng主要內容第3章MCS-51系列單片機的指令系統(tǒng)及匯編語言

計算機通過執(zhí)行程序完成人們指定的任務,程序由一條一條指令構成,能為CPU識別并執(zhí)行的指令的集合就是該CPU的指令系統(tǒng)。

MCS-51單片機匯編語言指令格式:

操作符目的操作數(shù),源操作數(shù)操作符指明該指令完成什么操作;操作數(shù)是指明該指令的操作對象。目的操作數(shù)是存放結果的。指令中操作數(shù)提供的方式稱為尋址方式。docin/sundae_meng計算機通過執(zhí)行程序完成人們指定的任務,程序由一條一條

指令中的常用符號Rn:

表示當前工作寄存器R0~R7中的一個。Ri:

代表R0和R1寄存器中的一個,用作間接尋址寄存器。dir:8位直接字節(jié)地址(片內RAM和SFR)#data:8位立即數(shù),即8位常數(shù)??梢詾?進制(B)、10進制、16進制(H)、字符(‘

’)#data16:

表示16位立即數(shù),即16位常數(shù),取值范圍為:#0000H~#0FFFFHaddr16:

表示16位地址addr11:

表示11位地址rel:

相對偏移量(為一字節(jié)補碼)用于相對轉移指令中bit:

位地址,在位地址空間中。 $:表示當前指令的地址。docin/sundae_meng 指令

指令中直接給出操作數(shù)的尋址方式。在51系列單片機的指令系統(tǒng)中,立即數(shù)用一個前面加“#”號的8位數(shù)(#data,如#30H)或16位數(shù)(#data16,如#2052H)表示。立即尋址中的數(shù),稱為立即數(shù)。例如指令:MOVA,#58H;58H→A3.1尋址方式

3.1.1立即尋址docin/sundae_meng 指令中直接給出操作數(shù)的尋址方式。在51系列單片機的

操作數(shù)的地址直接出現(xiàn)在指令中。 尋址對象:①內部數(shù)據(jù)存貯器:使用它的地址。②特殊功能寄存器:既可使用它的地址,也可以直接使用寄存器名。③位地址空間④程序存儲器空間例:MOVA,40H;(40H)→AMOV40H,41H;(41H)→(40H)

MOVP0,#45H;

45H→P0MOV80H,#45H;

45H→P0MOVC,18H;

位地址18H→C3.1.2直接尋址docin/sundae_meng操作數(shù)的地址直接出現(xiàn)在指令中。 3.1.2直接尋址d

操作數(shù)存放在寄存器中。尋址對象:A,B,C,DPTR,R0~R7。

B僅在乘除法指令中為寄存器尋址,在其他指令中為直接尋址。

A可以寄存器尋址又可以直接尋址,直接尋址時寫作ACC

例如:MOVA,R0;R0→AMULAB;A*B→BAADDA,ACC;A+A→A3.1.3寄存器尋址docin/sundae_meng 操作數(shù)存放在寄存器中。3.1.3寄存器尋址docin/s

操作數(shù)存放在以寄存器內容為地址的單元中,用做間址的寄存器為Ri(i=0,1)、DPTR。

①對片內的間接尋址用Ri(i=0,1)如:MOVR0,#20H

MOVR0,A;A→(20H)

②對片外的間接尋址可用Ri(i=0,1)或DPTR

如:MOVXDPTR,A;A→以DPTR的內容為地址的外部RAM中

MOVXR1,A;A→以P2R1內容為地址的外部RAM中③PUSH和POP指令的源操作數(shù)是以SP間接尋址注意:寄存器間接尋址不能訪問SFRMOVR1,#81HMOVA,R1;不能訪問SP,只能用MOVA,SP3.1.4寄存器間址docin/sundae_meng 操作數(shù)存放在以寄存器內容為地址的單元中,用做間址的

變址尋址只能訪問程序存儲器。操作數(shù)所在位置的地址由DPTR或PC寄存器與A的內容相加后形成。其中累加器A內容是可變的。變址尋址只有三條指令。

MOVCA,A+DPTR;(A+DPTR)→AMOVCA,A+PC;(A+PC)→AJMP

A+DPTR;A+DPTR→PC注意:①A的內容是無符號數(shù)。②PC值是指令的當前PC值,即下條指令的PC值3.1.5變址尋址docin/sundae_meng 變址尋址只能訪問程序存儲器。操作數(shù)所在位置的地址由3.1.6相對尋址

變址尋址只能訪問程序存儲器。相對尋址是將程序計數(shù)器PC的當前值與指令第二字節(jié)給出的偏移量相加,從而形成轉移的目標地址。

如:JZ61H注意:①相對偏移量是一字節(jié)有符號數(shù),用補碼表示,偏移范圍是:-128~+127。②PC值是指令的當前PC值,即下條指令的PC值。③源程序中偏移量常用符號地址表示。docin/sundae_meng3.1.6相對尋址變址尋址只能訪問程序存儲器

對可位尋址的位地址尋址。包括片內RAM的位地址空間和可位尋址的SFR(地址能被8整除) 如:MOVC,20H

;位尋址

MOVA,20H

;字節(jié)尋址以上兩條指令究竟是位尋址還是字節(jié)尋址,根據(jù)兩操作數(shù)類型一致的原則,由另一個操作數(shù)決定。

3.1.7

位尋址docin/sundae_meng對可位尋址的位地址尋址。包括片內RAM的位地址空立即尋址直接尋址寄存器尋址寄存器間接尋址變址尋址相對尋址位尋址片內RAM低128B單元√√工作寄存器組R0~R7√√√特殊功能寄存器SFRA、B、DPTR、C√√√程序存儲器√√√√片外RAM√位地址空間√√尋址方式與存儲空間的對應關系

docin/sundae_meng立即直接寄存器寄存器變址相對位尋址片內RAM√√工作寄存器組

dirRi

Rn#dataAMOVA, Rn

#datadir

RiMOVdir, ARn,Ri

#data

dir

MOVRi, A

dir

#data內部RAM、SFR之間的傳送MOV指令MOVRn,

Adir

#data3.2指令系統(tǒng)

3.2.1數(shù)據(jù)傳送與交換指令docin/sundae_mengdirRiRn#dataAMOVA, 例R1=20H,(20H)=55H,

MOVA,R1執(zhí)行后,A=55H。例(40H)=30H,

MOVR7,40H執(zhí)行后,R7=30H。例MOVR7,#40H執(zhí)行后,R7=40H。注意:寄存器之間無傳送;寄存器間址和寄存器之間無傳送;立即數(shù)不能做目標地址;docin/sundae_meng例R1=20H,(20H)=55H,注意:docin/sRi,ADPTR,AA,RiA,DPTRMOVXMOVCA,A+PCA,A+DPTR2.外部存儲器和A累加器之間的傳送MOVXA

外部數(shù)據(jù)存儲器程序存儲器MOVCdocin/sundae_mengRi,ADPTR,AMOVXMOVCA,

利用MOVX實現(xiàn)片外數(shù)據(jù)存儲器數(shù)據(jù)傳送

(2000H)→(2100H)

MOVDPTR,#2000H MOVXA,DPTR MOVDPTR,#2100H MOVXDPTR,A

;DPTR=2000H

;DPTR=2100H;A←X

;(2100H)←Xx片外數(shù)據(jù)存儲器不能直接尋址。下列為非法指令:

MOVXA,2000H×MOVX2100H,2000H×docin/sundae_meng利用MOVX實現(xiàn)片外數(shù)據(jù)存儲器數(shù)據(jù)傳送

利用Ri間址來實現(xiàn)將(2000H)→(2100H)MOVP2,#20H ;高位地址

MOVR0,#00 ;低位地址

MOVXA,R0 ;讀片外RAMMOVP2,#21H ;改變高位地址

MOVXR0,A ;寫片外RAMdocin/sundae_meng利用Ri間址來實現(xiàn)將(2000H)→(21

利用MOVC指令實現(xiàn)查表功能

注:①只能從程序存儲器讀取數(shù)據(jù)到A累加器。

②只能使用變址間接尋址方式

1)DPTR為基址寄存器

MOVCA,A+DPTR;A←(A+DPTR)

查表范圍為64KB程序存儲器任意空間。2)PC為基址寄存器

MOVCA,A+PC ;A←(A+PC)

常數(shù)表只能在查表指令后256B范圍內。docin/sundae_meng利用MOVC指令實現(xiàn)查表功能

例查表法求Y=X2。設X(0≤X≤15)在片內RAM20H單元,要求將查表求Y,存入片內RAM21H單元1)用DPTR作基址寄存器

ORG0100H SQU: MOVDPTR,#TAB ;確定表首地址

MOVA,20H ;取X

MOVCA,A+DPTR;查表求Y=X2

MOV21H,A ;保存Y RET ;子程序結束

… ;其它程序段

ORG0200H ;常數(shù)表格首地址TAB: DB00,01,04,09,…,225;平方表docin/sundae_meng例查表法求Y=X2。設X(0≤X≤15)在片內R

指令地址

源程序

ORG0100H ;程序起始地址

0100H SQU:MOVA,20H ;取X 0102H ADDA,#3 ;修正偏移量

0104H MOVCA,A+PC;查表求Y=X2 0105H MOV21H,A ;存結果

0107H RET ;子程序結束

0108H TAB:DB00,01,04 ;平方表

010BH DB09,…,225 思考題:當0≤X≤255時,如何用查表法編程求Y=X22)用PC作基址寄存器docin/sundae_meng指令地址 源程序思考題:當0≤3.交換指令

實現(xiàn)片內RAM區(qū)的數(shù)據(jù)雙向傳送1)字節(jié)交換指令

XCHA,Rn;A←→Rn XCHA,Ri;A←→(Ri)XCHA,dir;A←→(dir)2)半字節(jié)交換指令

XCHDA,Ri;A0~3←→(Ri)0~3SWAPA ;A4~7←→A0~3

dirRi

RnA4.堆棧操作指令

入棧指令:PUSHdir;SP←SP+1,(SP)←(dir)

出棧指令:POPdir;(dir)←(SP),SP←SP-1

RiA7~47~43~03~0A7~43~0docin/sundae_meng3.交換指令 dirRiRnAdirRiRn#dataA

dirRi

Rn#dataAA,Rn,Ri

#datadirADDADDCSUBBANLORLXRL加進位加借位減與或異或1.以A為目的操作數(shù)的算術、邏輯運算指令(24條)3.2.2算術運算和邏輯運算指令docin/sundae_mengdirRiRn#dataAdirRiRn#d2.以dir為目的操作數(shù)邏輯運算指令(6條)A#data

dir與ANL或ORL異或XRLdir,#dataA3.加1、減1指令RiAdirRnDPTRINCRiAdirRnDECdocin/sundae_meng2.以dir為目的操作數(shù)邏輯運算指令(6條)A#data4.十進制調整指令

DAA;僅對存于A中的加法結果進行十進制調整

若需完成十進制減法運算,則應變減法運算為補碼的加法運算即可,其減數(shù)X的補碼通過(99-X)+1再DAA后得到。

原則:和低4位大于9或有半進位,則低4位加6

和高4位大于9或有進位,則高4位加6例:(DATA)-(DATA+1)=>(DATA+2)Y-X=Y-X+100-->有效位為2位十進制,模為100=Y+(99-X)+1docin/sundae_meng4.十進制調整指令若需5.乘、除法指令MUL AB;A×B→BADIV AB;A÷B→商在A中,余數(shù)在B中6.專對A的指令CPL ACLR A;0→A;A→AMOVA,#99HDAACLRCADDA,DATASUBBA,DATA+1DAAADDA,#1MOVDATA+2,Adocin/sundae_meng5.乘、除法指令MUL AB;A×B→BADIV CYRRARLARLCARRCA移位指令(僅對A)00101101A01001011ACY11001011A000101101A1CY10010110A設1CYCYdocin/sundae_mengCYRRARLARLCARRCA移位1.調用程序和返回類指令

1)長調用

LCALLaddr16;addr16→PC0~15

指令功能同80X86中的CALL,調用范圍64KB全部空間,指令的機器碼為三字節(jié)。

2)短調用

ACALLaddr11;addr11→PC0~10

指令的功能同前,主要區(qū)別為:

addr11→PC0~10,而PC11~15保持原值不變,故其調用范圍為2KB,即子程序入口距當前PC不得超過2KB地址范圍。本指令的機器碼為二字節(jié)。3.2.3控制轉移類指令docin/sundae_meng1.調用程序和返回類指令3.2.3控制轉移類指令d3)子程序返回指令(從棧頂彈出斷點到PC)

RET;從調用子程序返回。

RETI;從中斷服務程序返回并恢復中斷優(yōu)先級狀態(tài)觸發(fā)器。2.轉移指令

1)無條件轉移指令(1)短轉移

AJMPaddr11;addr11→PC0~10

轉移范圍:2KB機器碼為2字節(jié)docin/sundae_meng3)子程序返回指令(從棧頂彈出斷點到PC)docin/s(2)長轉移

LJMPaddr16;addr16→PC0~15

轉移范圍:64KB機器碼為3字節(jié)。(3)間接轉移

JMPA+DPTR;A+DPTR→PC

分析下列程序段,說出當A分別為0和2時,程序轉置何處?該程序段的功能是什么?

MOVDPTR,#TABLEJMPA+DPTRTABLE:AJMPPROC0AJMPPROC1AJMPPROC2AJMPPROC3docin/sundae_meng(2)長轉移docin/sundae_meng

(4)無條件相對轉移

SJMPrel;PC+rel→PC,即As+2+rel→PC,機器碼為2字節(jié)

As為源地址(本指令的首地址),執(zhí)行本指令時當前PC=As+2,rel為轉移的偏移量,轉移可以向前轉(目的地址小于源地址),也可以向后轉(目的地址大于源地址),因此偏移量rel是1字節(jié)有符號數(shù),用補碼表示(-128~+127),所以指令轉移范圍在離源地址As的-126~+129字節(jié)之間。docin/sundae_meng(4)無條件相對轉移docin/sundae_meng2)條件轉移指令(1)累加器為零(非零)轉移

JZ/JNZrel;A=0/(A≠0)則轉移,否則順序執(zhí)行程序(2)減1不等于零轉移

DJNZRn/dir,rel

功能為:Rn(dir)-1→Rn(dir)

相減結果≠0轉,否則順序執(zhí)行程序docin/sundae_meng2)條件轉移指令docin/sundae_meng

(3)比較轉移指令

CJNEA,dir,relCJNEA,#data,relCJNERn,#data,relCJNERi,#data,rel操作數(shù)1不等于操作數(shù)2則轉,否則順序執(zhí)行。1例:Y=-1X≥ZX<Z

Z

X

YDATA+2DATA+1DATAMOVDATA+2,#0FFHMOVA,DATACJNEA,DATA+1,NEXTNEXT:JCNEXT1MOVDATA+2,#1NEXT1:RETdirRiRn#dataAdocin/sundae_meng(3)比較轉移指令操作數(shù)1不等于操作數(shù)2則轉,否則順序1.位傳送指令

MOVC,bit;(bit)→CYMOVbit,C;CY→bit2.位狀態(tài)控制指令

CLRC;0→CY

CLRbit;0→bitSETBC;1→CYSETBbit;1→bitCPLC;CY→CYCPLbit;bit→bit3.2.4位操作指令docin/sundae_meng1.位傳送指令3.2.4位操作指令docin/sund3.位邏輯運算指令

ANLC,bit;CY∧(bit)→CY

ANLC,/bit;CY∧(bit)→CY

ORLC,bit;CY∨(bit)→CY

ORLC,/bit;CY∨(bit)→CYdocin/sundae_meng3.位邏輯運算指令

ANLC,bit;CY

4.位轉移 位轉移根據(jù)位的值決定轉移,均為相對轉移指令。

JCrel;CY=1,則轉移,否則順序執(zhí)行程序

JNCrel;CY=0,則轉移,否則順序執(zhí)行程序

JBbit,rel;(bit)=1,則轉移,否則順序執(zhí)行程序

JNBbit,rel;(bit)=0,則轉移,否則順序執(zhí)行程序

JBCbit,rel;(bit)=1,則轉移,且該位清零,否則順序執(zhí)行程序docin/sundae_meng 4.位轉移docin/sundae_meng1.定義:匯編控制指令,沒有指令代碼,不能被CPU執(zhí)行,只用于匯編過程,為匯編程序提供匯編信息。2.常用偽指令(1)ORGORG是設置起始地址偽指令,其格式是:

ORG 16位地址或標號(2)ENDEND是結束匯編偽指令,其格式是:

END(3)DB DB是定義字節(jié)偽指令,其格式是:

[標號:]DB字節(jié)型數(shù)表(4)DW DW是定義字偽指令,其格式是:

[標號:] DW字型數(shù)表3.3偽指令docin/sundae_meng1.定義:3.3偽指令docin/sundae_meng(5)DS DS是定義存儲空間偽指令,其格式是:

[標號:] DS表達式(6)EQU EQU是賦值偽指令,其格式是: 字符名稱 EQU 數(shù)據(jù)或匯編符號(7)DATA DATA是數(shù)據(jù)地址賦值偽指令,其格式是: 字符名稱 DATA 表達式(8)BIT BIT是位地址賦值偽指令,其格式是: 字符名稱 BIT 位地址

詳見表3.3MCS-51中的偽指令docin/sundae_meng(5)DSdocin/sundae_meng進制間的轉換1.十進制→二進制(整數(shù))任何十進制數(shù)D有:D=dn-1×10n-1+dn-2×10n-2+…

+d1×101+d0×100

=(…(dn-1×10+dn-2)×10

+…

+d1)×10+d0規(guī)律:di×10+di-1(i=1,2,…n-1)按二進制運算規(guī)則運算則得二進制數(shù)3.4程序設計舉例docin/sundae_meng進制間的轉換1.十進制→二進制(整數(shù))任何十進制數(shù)D有:規(guī)律例:將4位十進制數(shù)D3D2D1D0轉換成二進制數(shù),設4位十進制數(shù)D3D2D1D0按分離BCD碼形式存放,要求結果的高位存放在R3中,結果的低位存放在R2中。方法:D3D2D1D0=(((0×10+D3)×10+D2)×10+D1)×10+D0結果:16位二進制數(shù)0D30D20D10D0DATAdocin/sundae_meng例:將4位十進制數(shù)D3D2D1D0轉換成二進制數(shù),設4位方法流程:設置指針指向DATA計數(shù)器初始(R7=3)Di初始→結果單元結果單元內容×10+Di-1→結果單元修改指針計數(shù)器-1→計數(shù)器↓↓↓↓↓↓計數(shù)器=0?↓返回YNdocin/sundae_meng流程:設置指針指向DAT

溫馨提示

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

評論

0/150

提交評論