第2章 指令系統(tǒng)2016_第1頁
第2章 指令系統(tǒng)2016_第2頁
第2章 指令系統(tǒng)2016_第3頁
第2章 指令系統(tǒng)2016_第4頁
第2章 指令系統(tǒng)2016_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章指令系統(tǒng)內(nèi)容提要尋址方式傳送與交換指令算術(shù)運算、邏輯運算指令控制轉(zhuǎn)移指令位操作指令指令系統(tǒng):

能為CPU識別并執(zhí)行的指令的集合。匯編語言指令格式: 操作符

目的操作數(shù),源操作數(shù) 操作符

第1操作數(shù),第2操作數(shù),第3操作數(shù)操作符:指令完成的操作;操作數(shù):指明該指令的操作對象。目的操作數(shù):存放結(jié)果的 指令中的常用符號Rn:n=(0~7),表示當(dāng)前工作寄存器R0~R7中的一個。Ri:i=(0、1),代表R0和R1寄存器中的一個,用作間接尋址寄存器。dir:8位直接字節(jié)地址(片內(nèi)RAM和SFR)

#data:8位立即數(shù),即8位常數(shù)??梢詾?進(jìn)制(B)、10進(jìn)制、16進(jìn)制(H)、字符(‘

’)、data16:表示16位立即數(shù),即16位常數(shù),取值范圍為#0000H~#0FFFFHaddr16:表示16位地址addr11:表示11位地址rel:相對偏移量(為一字節(jié)補碼)用于相對轉(zhuǎn)移指令中bit:位地址,在位地址空間中。

$:表示當(dāng)前指令的地址。;注釋符號地址:1、立即尋址指令中直接給出操作數(shù)的尋址方式。立即數(shù)用一個前面加“#“號的8位數(shù)(#data,如#30H)或16位數(shù)(#data16,如#2052H)表示。立即尋址中的數(shù),稱為立即數(shù)。例如指令:MOVA,#30H2.1尋址方式

指令中提供操作數(shù)的形式2、直接尋址 操作數(shù)的地址直接出現(xiàn)在指令中。 尋址對象:①內(nèi)部數(shù)據(jù)存貯器:使用它的地址。

②特殊功能寄存器:既可使用它的地址,也可以直接使用寄存器名。 41H 78H40H 56H41H 78H40H 78H例:MOVA,40H;A=56H機器碼E540MOVP0,#45H;45H→P0,P0為直接尋址的SFR,其地址為80H,機器碼為758045MOV40H,41H;機器碼為854140內(nèi)部RAM(41H)→(40H)(40H)=(41H)=78H

3、寄存器尋址 操作數(shù)存放在寄存器中。尋址對象:A,B,DPTR,R0~R7。B僅在乘除法指令中為寄存器尋址,在其他指令中為直接尋址。A可以寄存器尋址又可以直接尋址,直接尋址時寫作ACC例如:MOVA,R0;R0→A,A、R0均為寄存器尋址,機器碼E8

MULAB;A*B→BA,A、B為寄存器尋址,機器碼A4 MOVB,R0;R0→B,R0為寄存器尋址,B為直接尋址機器碼88F0,其中F0為B的字節(jié)地址(見表1-2)

PUSHACC;A的內(nèi)容壓入堆棧機器碼C0E04、寄存器間址

操作數(shù)存放在以寄存器內(nèi)容為地址的單元中例如:MOVR0,#20H

MOV@R0,A;A→(20H)地址的內(nèi)部RAMMOVXA,@R1;外部RAM(地址為P2R1)的內(nèi)容→AMOVX@DPTR,A;A→以DPTR內(nèi)容為地址 的外部RAM

5、變址尋址 以DPTR或PC寄存器內(nèi)容為基地址,和A的內(nèi)容為相加形成操作數(shù)的地址。其中累加器A內(nèi)容是可變的。 例如:MOVCA,@A+DPTR6、相對尋址相對尋址是將程序計數(shù)器PC的當(dāng)前值與指令第二字節(jié)給出的偏移量相加,從而形成轉(zhuǎn)移的目標(biāo)地址。例如:JZ符號地址7、位尋址對片內(nèi)RAM中20H~2FH中的128個位地址及SFR中的可位尋址的位地址尋址。例如:MOVC,20H;20H位的內(nèi)容送CY標(biāo)志位,C稱為位累加器。MOVA,20H;字節(jié)尋址,將內(nèi)部

RAM中20H單元中的內(nèi)容送給累加器A。以上兩條指令均為尋址,究竟是位尋址還是字節(jié)尋址,根據(jù)兩操作數(shù)類型一致的原則,由另一個操作數(shù)決定。

dir@Ri

Rn#dataAMOVA,

Rn

#datadir

@RiMOVdir,

ARn,@Ri

#data

dir

MOVRn,MOV@Ri,

A

dir

#data2.2數(shù)據(jù)傳送與交換指令2.2.1內(nèi)部RAM和SFR間的傳送MOV

Adir

#data例R1=20H,(20H)=55H,指令MOVA,@R1執(zhí)行后,A=55H。例

(40H)=30H,指令MOVR7,40H執(zhí)行后,R7=30H。例MOVR7,#40H執(zhí)行后,R7=40H。例判斷下列指令的正誤:MOV29H,R7MOV25H,P1MOV56H,#70HMOV34H,28HMOVR3,R7MOV@R3,R7MOVR3,#D2HMOV#34H,28HMOVA,#280HMOVP3,P1編程將R3的內(nèi)容送R1。√√×√×√√××√MOVA,R3MOVR1,AA外部數(shù)據(jù)存儲器程序存儲器

@Ri,A@DPTR,AA,@RiA,@DPTRMOVXMOVCA,@A+PCA,@A+DPTR2.2.2外部存儲器和A累加器之間的傳送MOVXMOVCMOVX指令舉例

例:實現(xiàn)片外數(shù)據(jù)存儲器數(shù)據(jù)傳送(2000H)→(2100H)。

MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A

;DPTR=2000H

;DPTR=2100H;A←X

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

MOVXA,2000H×MOVX2100H,2000H×使用P2口和8位寄存器Ri間址:MOVP2,#20H ;高位地址MOVR0,#00 ;低位地址MOVXA,@R0 ;讀片外RAMMOVP2,#21H ;改變高位地址MOVX@R0,A ;寫片外RAM查表指令MOVC

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

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

多用于查常數(shù)表程序,直接求取常數(shù)表中的函數(shù)值1)DPTR為基址寄存器

MOVCA,@A+DPTR;A←(A+DPTR) 查表范圍為64KB程序存儲器任意空間。2)PC為基址寄存器

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

常數(shù)表只能在查表指令后256B范圍內(nèi)。例查表法求Y=X2。設(shè)X(0≤X≤15)在片內(nèi)RAM20H單元,要求將查表求Y,存入片內(nèi)RAM21H單元1)用DPTR作基址寄存器

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

MOVA,20H ;取X

MOVCA,@A+DPTR;查表求Y=X2 MOV21H,A ;保存Y RET ;子程序結(jié)束

… ;其它程序段

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

源程序

ORG0100H ;程序起始地址

0100H SQU:MOVA,20H ;取X 0102H ADDA,#3 ;修正偏移量 0104H MOVCA,@A+PC;查表求Y=X2 0105H MOV21H,A ;存結(jié)果 0107H RET ;子程序結(jié)束 0108H TAB:DB00,01,04 ;平方表 010BH DB09,…,225 思考題當(dāng)0≤X≤255時,如何用查表法編程求Y=X22)用PC作基址寄存器(四)堆棧操作指令

入棧指令:PUSHdir;SP←SP+1,(SP)←(dir)例:設(shè)

A=02,B=56H,執(zhí)行下列指令序列后,SP=?A=?,B=?SBR:MOVSP,#30H PUSHA PUSHB MOVA,#0 MOVB,#01

POP B POPA RET ;設(shè)棧底;保護現(xiàn)場;恢復(fù)現(xiàn)場出棧指令:POP dir;(dir)←(SP),SP←SP-1 × × ×SP→ 02 × × ×SP→ 56 02 × × × 56SP→ 02 × × × 56 02SP→ × × × × ×SP→ ×堆棧操作示意:(三)交換指令

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

XCHA,Rn ;A←→Rn XCHA,@Ri ;A←→(Ri)XCHA,n ;A←→(n)習(xí)題將片內(nèi)RAM60H單元與61H單元的數(shù)據(jù)交換例設(shè)A=29H,(2AH)=38H執(zhí)行指令

XCHA,2AH后,A=? ,(2AH)=?38H29HXCH60H,61H←對嗎?2.半字節(jié)交換指令

XCHDA,@Ri;A0~3←(Ri)0~3 SWAPA ;A4~7←A0~3數(shù)字0~9的ASCII碼30H~39H85H壓縮的BCD碼和非壓縮的BCD碼見圖如1823壓縮的BCD碼為1823H非壓縮的BCD碼為01080203H非壓縮BCD×◎◎×AA08例2.2.2將片內(nèi)RAM2AH和2BH單元中的ASCII碼轉(zhuǎn)換成壓縮式BCD碼存入20H單元MOVA,#00H;A=00MOVR0,#2AH 85HR1→R0→習(xí)題:交換片內(nèi)RAM40H單元和41H單元的低半字節(jié)00XCHDA,@R0SWAPAXCHDA,@R0MOV20H,A;低4位交換A=08;A=80H;低4位交換;(20H)=85H3800A358085@R1@R03030INCR02.3算術(shù)運算和邏輯運算指令2.3.1指令對標(biāo)志位的影響有如下規(guī)律:

1)凡是對A操作指令(包括傳送指令)都將A中1個的奇偶反映到PSW的P標(biāo)志位上。即A中奇數(shù)個“1”,P=1;偶數(shù)個“1”,P=0。

2)傳送指令、加1、減1指令、邏輯運算指令不影響Cy、OV、AC標(biāo)志位。

3)加減運算指令影響標(biāo)志位,乘除指令使Cy=0,當(dāng)乘積大于255,或除數(shù)為0時,OV置1。

4)對進(jìn)位位Cy(指令中用C表示)進(jìn)行操作的指令和大環(huán)移指令,顯然會影響Cy。

dir@Ri

Rn#dataA

dir@Ri

Rn#dataAADDADDCSUBBANLORLXRLA,

Rn,@Ri

#datadir加進(jìn)位加借位減與或異或2.3.2以A為目的操作數(shù)的算術(shù)、邏輯運算指令(24條)2.3.3以dir為目的操作數(shù)邏輯運算指令(6條)A#data

dir與ANL或ORL異或XRLdir,#dataA

算術(shù)類指令的操作意義非常明確,注意減指令只有帶借位減,因此在多字節(jié)減法中,最低字節(jié)作減法時,注意先清CY。邏輯運算是按位進(jìn)行的,兩數(shù)運算的運算法則是:與:有“0”則“0”;或:有“1”則“1”異或:同為“0”

,異為“1”;與“0”異或值不變:與“1”異或值變反。邏輯指令常用于對數(shù)據(jù)位進(jìn)行加工。00001111

100001101000111100001111

1000011010001001例:A=0FH,執(zhí)行ORLA,#86H后A=8FH例:A=0FH,執(zhí)行XRLA,#86H后A=89H^+ARn@RidirDPTRINC減1指令:DECARn@Ridir2.3.4加1指令:提問:沒有DECDPTR指令,怎么解決DPTR的減1?2.3.5十進(jìn)制調(diào)整指令計算機完成二進(jìn)制加法其和也為二進(jìn)制,如果是十進(jìn)制相加(即BCD碼相加)想得到十進(jìn)制的結(jié)果,就必須進(jìn)行十進(jìn)制調(diào)整(即BCD碼調(diào)整)。調(diào)整指令:DAA;將A中二進(jìn)制相加和調(diào)整成BCD碼調(diào)整方法:和低4位大于9或有半進(jìn)位則低4位加6;和的高4位大于9或有進(jìn)位,則高4位加6。指令根據(jù)相加和及標(biāo)志自行進(jìn)行判斷,因此該指令應(yīng)緊跟在加指令之后,至少在加指令和該指令之間不能有影響標(biāo)志的指令。DAA指令只對一個字節(jié)和調(diào)整,如為多字節(jié)相加必須進(jìn)行多次調(diào)整。此指令不能對減法結(jié)果進(jìn)行調(diào)整。

例2-13完成56+17的編程。

MOVA,#56H;A存放BCD碼56HMOVB,#17H;B存放BCD碼17HADDA,B;A=6dHDAA;A=73HSJMP$56H17H6dH673H++ 例2:A=9AH,R2=E3H,PSW=0,執(zhí)行指令

ADDCA,R2后求:

A=,Cy=,OV=,AC=,P= PSW=?

10011010

11100011

+

0

1

011111017DH110010000100=84HCYACF0RS1RS0OV---P100001002.3.6專對A的指令:A取反

CPLA;A→AA清0CLRA;0→A例如:A=9FH,執(zhí)行CPLA后A=60HCYCYRRARLARLCARRCA移位指令(僅對A)1001011000101101AA設(shè)01001011A1CY11001011A000101101A1CYCY2.3.7乘除法指令MULAB ;AXB=BXADIVAB ;A/B商-A,余數(shù)-B

若B=0,指令執(zhí)行后

OV=1,A,B不變執(zhí)行時間4個機器周期例

編程將片內(nèi)RAM2AH和2BH單元中的ASCII碼轉(zhuǎn)換成壓縮式BCD碼存入20H單元數(shù)字0~9的ASCII碼30H~39H85H壓縮的BCD碼和非壓縮的BCD碼的存放規(guī)則見左圖如1823壓縮的BCD碼為1823H

非壓縮的BCD碼為01080203H非壓縮BCD2.3.8指令綜合應(yīng)用舉例08MOVA,#00H;A=00MOVR0,#2AH MOVR1,#2BHXCHDA,@R0SWAPAXCHDA,@R1XCH A,20H85HR1→R0→00;低4位交換A=08;A=80H;低4位交換;(20H)=85H3800A358085@R1@R03030

MOV30H,20H;(30H)=(20H)

ANL30H,#1FH;保留低五位

MOVA,21H;A=(21H)

SWAPA;高低四位交換

RLA;低三位變到高三位位置

ANLA,#0E0H;保留高三位

ORL30H,A;和(30H)的低五位合并

SJMP$00021H20H2-15編程將21H單元的低三位和20H單元中的低五位合并為一個字送30H單元,要求(21H)的低三位放在高位上。00000+30H=30HSWAP

0RLA例2-16把在R4和R5中的兩字節(jié)數(shù)取補(高位在R4中)

CLRC;CY清零

MOVA,R5CPLAADDA,#01H;低位取反加1MOVR5,AMOVA,R4CPLA;高位取反

ADDCA,#00H;加低位的進(jìn)位

MOVR4,ASJMP$例2-17把R7中的無符號數(shù)擴大10倍。

MOVA,R7MOVB,#0AHMULABMOVR7,A;R7存積的低位

MOVR6,B;R6存積的高位

SJMP$例2-18把R1R0和R3R2中的2個4位BCD碼數(shù)相加,結(jié)果送R5R4中,如有進(jìn)位則存于進(jìn)位位C中。

CLRC;清進(jìn)位

MOVA,R0ADDA,R2;低字節(jié)相加

DAA;十進(jìn)制調(diào)整

MOVR4,A;存低字節(jié)相加結(jié)果MOVA,R1ADDCA,R3;高字節(jié)相加

DAA;十進(jìn)制調(diào)整

MOVR5,A;存低字節(jié)相加結(jié)果SJMP$思考:如果最高位相加有進(jìn)位,并要求存于R6中,往下如何編?2.4控制轉(zhuǎn)移指令

這一類指令的功能是改變指令的執(zhí)行順序,轉(zhuǎn)到指令指示的新的PC地址執(zhí)行。MCS-51單片機的控制轉(zhuǎn)移指令有以下類型:無條件轉(zhuǎn)移:無需判斷,執(zhí)行該指令就轉(zhuǎn)移到目的地址。條件轉(zhuǎn)移:需判斷標(biāo)志位是否滿足條件,滿足條件轉(zhuǎn)移到目的地址,否則順序執(zhí)行。絕對轉(zhuǎn)移:轉(zhuǎn)移的目的地址用絕對地址指示,通常為無條件轉(zhuǎn)移。相對轉(zhuǎn)移:轉(zhuǎn)移的目的地址用相對于當(dāng)前PC的偏差(偏移量)指示,通常為條件轉(zhuǎn)移。長轉(zhuǎn)移或長調(diào)用:目的地址距當(dāng)前PC64KB地址范圍內(nèi)。短轉(zhuǎn)移或短調(diào)用:目的地址距當(dāng)前PC2KB地址范圍。1.長調(diào)用

LCALLaddrl16;addr16→PC0~15

說明:(1)該指令功能是①保護斷點,即當(dāng)前PC(本指令的下一條指令的首地址)壓入堆棧。②子程序的入口地址addr16送PC,轉(zhuǎn)子程序執(zhí)行。(2)本指令為64KB地址范圍內(nèi)的調(diào)子程序指令,子程序可在64KB地址空間的任一處。(3)本指令的機器碼為三字節(jié)12addr16。2.短調(diào)用

ACALLaddr11;addr11→PC0~10說明:(1)該指令的功能是①保護斷點,即當(dāng)前PC壓入堆棧。

②addrl11→PC0~10,而PC11~15保持原值不變。(2)本指令為2KB地址范圍的調(diào)子程序指令,子程序入口距當(dāng)前PC不得超過2KB地址范圍。(3)本指令的機器碼為二字節(jié),設(shè)addr11的各位是a10a9a8…a2a1a0,則ACALL指令機器碼a10a9a810001a7a6a5a4a3a2a1a0,其中10001是ACALL指令的操作碼。

例2-18子程序調(diào)用指令A(yù)CALL在程序存儲器中的首地址為0100H,子程序入口地址為0205H。試確定能否使用ACALL指令實現(xiàn)調(diào)用?如果能使用,確定該指令的機器碼。解:因為ACALL指令首地址在0100H,而ACALL是2字節(jié)指令,所以下一條指令的首地址在0102H。0102H和0250H在同一2KB地址范圍內(nèi),故可用ACALL調(diào)用。調(diào)用入口地址為0250H,ACALL指令的機器碼形式為:0101000101010000B=5150H。3.子程序返回指令RET;從調(diào)用子程序返回。功能:從棧頂彈出斷點到PC。RETI;從中斷服務(wù)程序返回。功能:從棧頂彈出斷點到PC,并恢復(fù)中斷優(yōu)先級狀態(tài)觸發(fā)器。2.4.2轉(zhuǎn)移指令1.無條件轉(zhuǎn)移指令(1)短轉(zhuǎn)移

AJMPaddr11;addr11→PC0~10說明:①轉(zhuǎn)移范圍:本指令為2KB地址范圍內(nèi)的轉(zhuǎn)移指令。對轉(zhuǎn)移目的地址的要求與ACALL指令對子程序入口地址的要求相同。②機器碼形式:本指令為2字節(jié)指令。設(shè)addr11的各位是a10a9a8…a2a1a0,則指令的機器碼為a10a9a800001a7a6a5a4a3a2a1a0。(2)長轉(zhuǎn)移LJMPaddr16;addr16→PC0~15說明:①本指令為64KB程序存儲空間的全范圍轉(zhuǎn)移指令。轉(zhuǎn)移地址可為16位地址中的任意值。②本指令為3字節(jié)指令02addr16。(3)間接轉(zhuǎn)移

JMP@A+DPTR;A+DPTR→PC例2-20A=02H,DPTR=2000H,指令JMP@A+DPTR執(zhí)行后,PC=2002H。也就是說,程序轉(zhuǎn)移到2002H地址單元去執(zhí)行。例2-21現(xiàn)有一段程序如下:

MOVDPTR,#TABLEJMP@A+DPTRTABLE:AJMPPROC0AJMPPROC1AJMPPROC2AJMPPROC2根據(jù)JMP@A+DPTR指令的操作可知,當(dāng)A=00H時,程序轉(zhuǎn)入到地址PROC0處執(zhí)行;當(dāng)A=02H時,轉(zhuǎn)到PROC1處執(zhí)行……可見這是一段多路轉(zhuǎn)移程序,進(jìn)入的路數(shù)由A確定。因為AJMP指令是2字節(jié)指令,所以A必須為偶數(shù)。以上均為絕對轉(zhuǎn)移指令,下面介紹相對轉(zhuǎn)移指令。(4)無條件相對轉(zhuǎn)移

SJMPrel;PC+rel→PC,即As+2+rel→PC,機器碼為80rel說明:As為源地址(本指令的首地址),該指令為2字節(jié)指令,執(zhí)行本指令時

當(dāng)前PC=As+2,

rel

為轉(zhuǎn)移的偏移量,轉(zhuǎn)移可以向前轉(zhuǎn)(目的地址小于源地址),也可以向后轉(zhuǎn)(目的地址大于源地址),因此偏移量rel是1字節(jié)有符號數(shù),用補碼表示(-128~+127),所以指令轉(zhuǎn)移范圍在離源地址As的-126~+129字節(jié)之間。2.條件轉(zhuǎn)移指令(1)累加器為零(非零)轉(zhuǎn)移JZrel;A=0則轉(zhuǎn)移(As+2+rel→PC)

JNZrel;A≠0程序順序執(zhí)行,機器碼為60rel

dir@Ri

Rn#dataADJNZDJNZ(2)減1不等于零轉(zhuǎn)移DJNZRn,rel;Rn-1DJNZdir,.rel本指令有自動減1功能。(3)比較轉(zhuǎn)移指令CJNEA,dir,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel說明:①CJNE指令都是3字節(jié)指令,作減操作,不回送結(jié)果,影響CY標(biāo)志。②若第一操作數(shù)大于或等于第二操作數(shù),則標(biāo)志CY=0。若第一操作數(shù)小于第二操作數(shù),則CY=1。這幾條指令除實現(xiàn)兩操作數(shù)相等與否的判斷外,利用對CY的判斷,還可完成兩數(shù)大小的比較。例2-23試說明以下一段程序運行后A中的結(jié)果。

MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$根據(jù)程序可知A=10+9+8+7+6+5+4+3+2+1=55=37H例2-25編寫程序,要求讀P1端口上的信息,若不為55H,則程序等待,直到P1端口為55H時,程序才往下順序執(zhí)行。程序:MOVA,#55H;A=55HCJNEA,P1,$;P1≠55H,則程序循環(huán)執(zhí)行本指令

在實際編程中,轉(zhuǎn)移的目的地址不管是addr11、addr16、還是rel,均是一符號地址表示的(如SJMPABC,AJMPLOOP…),轉(zhuǎn)移的類型是通過指令的操作符來決定的。3。相對偏移量rel的求法在相對轉(zhuǎn)移中,用偏移量rel和轉(zhuǎn)移指令所處的地址值來計算轉(zhuǎn)移的目的地址,rel是1字節(jié)補碼.在填機器碼時,需計算rel,下面介紹計算rel的方法。設(shè)本條轉(zhuǎn)移指令的首地址為As——源地址,指令字節(jié)數(shù)為Bn——2字節(jié)或3字節(jié),要轉(zhuǎn)移的目標(biāo)地址為Ad——目的地址,當(dāng)前PC=As+Bn因為在執(zhí)行本條指令時,PC已經(jīng)指向了下一條指令,見下圖:Ad0100MN:…….

…....As0125BF05relCJNER7,#06,MN當(dāng)前PC0128當(dāng)前PC=As+Bn=0125+3=0128Bn=3rel=Ad-當(dāng)前PC=0100H-0128H=-28H-28求補得D8H于是rel=Ad-當(dāng)前PC=Ad-(As+Bn)=Ad-As-Bn

在上例中于是rel=(Ad-As-Bn)補這就是在已知源地址,目的地址和指令的長度時,計算rel大小的公式。例2-26MCS-51單片機指令系統(tǒng)中,沒有停機指令,通常用短轉(zhuǎn)移指令SJMP$($為本條指令的首地址)來實現(xiàn)動態(tài)停機的操作,試寫出這條指令中機器碼。解:查附錄A,SJMPrel的指令碼為80rel據(jù)題意本條指令的首地址As=$,轉(zhuǎn)移的目的地址是本條指令地址,即Ad=$該指令為兩字節(jié),即Bn=2,rel=(Ad-As-Bn)補=($-$-2)補=(-2)補=FEH所以SJMP$指令的機器碼是80FEH。例2-27計算下面程序中CJNE指令的偏移量。

LOOP:MOVA,P1CJNEA,#55H,LOOP解由于MOVA,P1是2字節(jié)指令,故CJNE指令的首地址是LOOP+2。又因為CJNE是3字節(jié)指令,于是有:Ad=LOOP,As=LOOP+2,Bn=3rel=[LOOP-(LOOP+2)-3]補=[-5]補=FBH所以CJNEA,#55H,LOOP的指令碼為B455FBH。2.4.3空操作指令

NOP機器碼00該指令經(jīng)取指,譯碼后不進(jìn)行任何操作(空操作)而轉(zhuǎn)到下一條指令,常用于生產(chǎn)一個機器周期的延時,或上機修改程序時作填充指令,以方便增減指令。2.4.4指令應(yīng)用舉例例2-28將A累加器的低四為取反四次、高四位不變。每變換一次,從P1輸出。方法一加1計數(shù):MOVR0,#0;計數(shù)初值送0LL:XRLA,#0FH;高4位不變,低四位取反

INCR0;次數(shù)加1MOVP1,A;從P1輸出

CJNER0,#04,LL;不滿四次循環(huán)

RET方法二減1計數(shù):MOVR0,#04H;計數(shù)初值送4LL:XRLA,#0FHMOVP1,ADJNZR0,LL;次數(shù)減1不等于0循環(huán)

RET例2-29在內(nèi)部RAM的40H地址單元中,有1字節(jié)符號數(shù),編寫求其絕對值后放回原單元的程序。程序如下: MOVA,40HANLA,#80HJNZNEG;為負(fù)數(shù)轉(zhuǎn)移

SJMP$;為正數(shù),絕對值=原數(shù),不改變原單元內(nèi)容NEG: MOVA,40H;為負(fù)數(shù)求補,得其絕對值

CPLA INCA MOV40H,A SJMP$有符號數(shù)在計算機中以補碼形式存放,例如-5,存放在內(nèi)部RAM中為FBH,求補后得5,即|-5|=5。2.5位操作指令MCS-51單片機的特色之一就是具有豐富的位處理功能,以進(jìn)位標(biāo)志CY為位累加器C,使得開關(guān)量控制系統(tǒng)的設(shè)計變得十分方便。在程序中位地址的表達(dá)有多種方式:

1)用直接位地址表示,如D4H。

2)用“·”操作符號表示,如PSW.4,或D0H.43)用位名稱表示,如RS1。4)用用戶自定義名表示。如ABCBITD4H,其中ABC定義為D4H位的位

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論