《MSP430系列超低功耗單片機原理與系統(tǒng)設(shè)計》課件第4章_第1頁
《MSP430系列超低功耗單片機原理與系統(tǒng)設(shè)計》課件第4章_第2頁
《MSP430系列超低功耗單片機原理與系統(tǒng)設(shè)計》課件第4章_第3頁
《MSP430系列超低功耗單片機原理與系統(tǒng)設(shè)計》課件第4章_第4頁
《MSP430系列超低功耗單片機原理與系統(tǒng)設(shè)計》課件第4章_第5頁
已閱讀5頁,還剩240頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章MSP430系列單片機的指令系統(tǒng)與程序設(shè)計

4.1MSP430指令系統(tǒng)概述

4.2尋址方式

4.3指令系統(tǒng)介紹

4.4匯編語言程序設(shè)計

4.5C語言程序設(shè)計基礎(chǔ)

4.6MSP430的開發(fā)環(huán)境

習(xí)題

4.1MSP430指令系統(tǒng)概述

4.1.1匯編語言語句格式程序設(shè)計語言是實現(xiàn)人機交換信息的重要工具。一般來說高級語言、匯編語言和機器語言都可以用程序編制。機器語言是用二進制數(shù)表示的機器指令,能被計算機直接識別并執(zhí)行,但機器語言不便記憶和理解,書寫時也容易出錯。匯編語言是用助記符來表示機器指令的,與機器碼一一對應(yīng),便于記憶和理解,易于掌握和使用,與高級語言相比程序結(jié)構(gòu)緊湊,節(jié)省存儲空間,執(zhí)行效率高。對于適用于實時測控系統(tǒng)的單片機來說,采用匯編語言編程最為方便。

匯編語言(AssemblyLanguage)是用助記符和標(biāo)號地址來編寫程序語言的,直接面向機器,因機器而異。匯編語言的語句由四部分組成:標(biāo)號、操作碼、操作數(shù)和注釋。MSP430單片機的指令格式如下:

【標(biāo)號】操作碼,【操作數(shù)】【;注釋】

標(biāo)號:用戶設(shè)定的符號,表示該指令所在的地址。由匯編器將標(biāo)號翻譯成該行語句的物理地址。標(biāo)號并非每一個語句都有,只有在需要時才使用。書寫時最左邊對齊,后面不必用冒號。

操作碼:指令的操作功能,是任何一個語句都不可缺少的。

操作數(shù):規(guī)定數(shù)據(jù)的類型和所用的尋址方式。如果有兩個操作數(shù),則第一個為源操作數(shù),第二個為目的操作數(shù),源操作數(shù)和目的操作數(shù)之間用逗號分隔;如果只有一個操作數(shù),該操作數(shù)既是源操作數(shù),又是目的操作數(shù)。有的指令也可以沒有操作數(shù),如NOP指令。

注釋:語句的說明部分,它必須用分號“;”和指令隔開,注解該指令具體完成了什么操作,它是為了方便人們閱讀程序而設(shè)定的。計算機在匯編時對注釋部分不作處理。

4.1.2指令系統(tǒng)中的符號說明

指令系統(tǒng)中各符號的含義介紹如下:

(1)前面帶有標(biāo)志“*”的指令是仿真指令,仿真指令的使用結(jié)合了CPU結(jié)構(gòu)和執(zhí)行方便的內(nèi)核指令,使得代碼效率更高,速度更快;

(2)“→”表示“寫內(nèi)容到”;

(3)“src”和“dst”分別表示源操作數(shù)和目的操作數(shù);

(4)狀態(tài)位中“*”表示影響,“-”表示不影響,“0”和“1”表示清零和置位;

(5)“@”表示寄存器間接尋址,“direct”代表直接地址;

(6)指令助記符的后綴“.W”或無后綴表示其為字操作指令,在字操作指令中,存儲器地址一定要對準(zhǔn)偶數(shù)地址,指令助記符的后綴“.B”表示其為字節(jié)操作指令;

(7)Rn表示R0~R15;

(8)PC/R0為程序計數(shù)器;

(9)SP/R1為堆棧指針;

(10)TOS為堆棧頂;

(11)&后面的數(shù)據(jù)為具體的地址;

(12)#是立即數(shù)的前綴,后面的數(shù)為立即數(shù);

(13)?MSB為最高有效位;

(14)LSB為最低有效位;

(15)+表示內(nèi)容增加;

(16)-內(nèi)容減少;

(17)V為溢出標(biāo)志,N為負標(biāo)志,Z為零標(biāo)志,C為進位標(biāo)志;

(18)(×)表示某寄存器或某單元中的內(nèi)容;

(19)((×))表示間接尋址單元中的內(nèi)容;

(20)?EDE、TONI、TOM和LEO是一般的符號,它們沒有特殊的含義。

4.1.3指令的代碼格式

MSP430單片機指令系統(tǒng)的代碼格式有雙操作數(shù)指令(內(nèi)核指令)代碼格式、單操作數(shù)指令(內(nèi)核指令)代碼格式、條件和無條件轉(zhuǎn)移指令代碼格式,下面分別進行介紹。

1.雙操作數(shù)指令(內(nèi)核指令)

雙操作數(shù)指令由4個域組成,共16位代碼。

操作碼域,4位[操作碼]。

源域,6位[源寄存器+As]。

字節(jié)操作識別符,1位[B/W]。

目的域,5位[目的寄存器+Ad]。

2.單操作數(shù)指令(內(nèi)核指令)

單操作數(shù)指令是由2個主域組成的,共16位代碼。

3.條件和無條件轉(zhuǎn)移指令(內(nèi)核指令)

該類指令包括2個主域,共16位代碼。

操作碼域,6位。

跳轉(zhuǎn)偏移域,10位。

轉(zhuǎn)移指令可跳轉(zhuǎn)到相對于當(dāng)前地址范圍在-511~+512字之間的地址。匯編器計算出有符號的偏移,并把它們插入操作碼。

轉(zhuǎn)移類指令不影響狀態(tài)位,當(dāng)發(fā)生轉(zhuǎn)移時,可通過偏移量改變PC值,公式為

PCnew?=?Pcold?+?2?+?2?×?偏移量

4.1.4無需ROM補償?shù)姆抡嬷噶?/p>

無需ROM補償?shù)姆抡嬷噶羁捎镁喼噶罴抡?,匯編器接收仿真指令,并能夠插入適當(dāng)?shù)膬?nèi)核指令。MSP430指令系統(tǒng)中無需ROM補償?shù)姆抡嬷噶钊绫?-1所示。

表4-1無需ROM補償?shù)姆抡嬷噶?/p>

4.1.5指令的時鐘周期與指令長度

MSP430的指令執(zhí)行速度(指令所用的時鐘周期數(shù),這里時鐘周期指MCLK的周期)和指令長度(所占用存儲空間)與指令的格式和尋址模式密切相關(guān)。在不同的尋址模式下,CPU尋找操作數(shù)的路徑不一樣,當(dāng)然要占用不同的時間與不同的存儲空間。表4-2和4-4給出了MSP430指令的時鐘周期數(shù)和指令長度,表4-3和表4-5給出了簡單判定雙操作數(shù)和單操作數(shù)的CPU指令周期方式。

表4-2雙操作數(shù)指令的時鐘周期數(shù)與指令長度

表4-3雙操作數(shù)指令執(zhí)行周期

表4-4單操作數(shù)指令的時鐘周期數(shù)與指令長度

表4-5單操作數(shù)指令執(zhí)行周期

例如:PUSH#500H;需要4個時鐘周期。

對于跳轉(zhuǎn)類指令,它們的時鐘周期數(shù)與指令長度是固定的。條件跳轉(zhuǎn)指令無論跳轉(zhuǎn)與否都要占用2個時鐘周期,指令長度為1個字長。RETI要占用5個時鐘周期,指令長度也是1個字長。除了CPU的指令外,CPU還有一些操作也將占用時間,但不占用存儲空間(因為不是程序指令)。它們是以下一些操作:

中斷響應(yīng),占用6個時鐘周期;

WDT復(fù)位,占用4個時鐘周期;

系統(tǒng)復(fù)位,占用4個時鐘周期。

4.2尋

單片機執(zhí)行程序的過程是不斷地尋找操作數(shù)并進行操作的過程,尋址方式是指CPU尋找操作數(shù)或操作數(shù)地址的方法。尋址方式是計算機的重要性能指標(biāo)之一,也是匯編程序設(shè)計中最基本的內(nèi)容。尋址方式越多,單片機指令功能越強,靈活性越大。MSP430共有7種尋址方式。其中,源操作數(shù)可用全部的7種方式尋址,目的操作數(shù)有4種尋址方式,它們可以訪問整個地址空間,如表4-6所示。

表4-6尋址方式

4.2.1寄存器尋址

操作數(shù)的地址由寄存器直接給出,寄存器的內(nèi)容就是指令中的操作數(shù),這種尋址方式稱為寄存器尋址。寄存器尋址方式是將源操作數(shù)中的內(nèi)容移到目的操作數(shù),而源操作數(shù)內(nèi)容不變,通常占1到2個字。源操作數(shù)和目的操作數(shù)都可以用于寄存器尋址。寄存器尋址一般用于對時間要求比較嚴(yán)的操作。匯編源程序:

MOVR10,

R11;

設(shè)指令執(zhí)行前:

(R10)=0A022H,(R11)=0FA00H,(PC)=Pcold;

指令執(zhí)行后:

(R10)=0A022H,(R11)=0A022H,(PC)=PCold+2。

4.2.2變址尋址

變址尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址為寄存器內(nèi)容加上前面的偏移量,一般占2~3個字,格式如下:

圖4-1變址指令執(zhí)行過程

變址尋址中源操作數(shù)或目的操作數(shù)中涉及的寄存器內(nèi)容在執(zhí)行前后不變。這種尋址方式對源操作數(shù)和目的操作數(shù)都有效,例如:

MOVR6,3(R8);

MOV5(R6),R7

4.2.3符號尋址

這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在指令中直接給出,格式如下:

其中,操作數(shù)的地址為EDE和TONI。(EDE)=PC+X,(TONI)=PC+Y。X,Y存在指令的后續(xù)中,匯編程序能自動計算并插入偏移量X和Y。

例如:MOVEDE,TONI;(EDE)=0F016H,(TONI)=01114H

解釋:將地址EDE單元中的內(nèi)容移到地址為TONI的單元中(見圖4-2)。

圖4-2符號指令執(zhí)行過程

例如:

MOVTAB,R5;

TABDW13F2H,2213H,3ED4H ;將符號TAB所表示的數(shù)據(jù)作為地址,再將該地址中的

;數(shù)據(jù)送達R5

執(zhí)行前:R5=43F2H,TAB標(biāo)號所指示的地址處的數(shù)據(jù)為字13F2H;

執(zhí)行后:R5=13F2H;

這種尋址模式既可用于源操作數(shù),也可用于目的操作數(shù)。下面的語句都屬于符號尋址模式:

MOV.BR6,LOOP; ;目的操作數(shù)符號尋址

MOVTAB,&0316H ;源操作數(shù)符號尋址

MOVR5,TAB ;源操作數(shù)符號尋址

4.2.4絕對尋址

這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在指令中直接給出,主要用于定位絕對的、固定地址的硬件外圍模塊,對它們絕對尋址可保證軟件的透明度。絕對尋址可以看做是當(dāng)PC=0時的符號尋址,格式如下:

其中,EDE和TONI為操作數(shù)地址。將地址EDE的內(nèi)容移到地址TON1中,指令后續(xù)字中給出操作數(shù)的地址。

例如:MOV&EDE,&TONI;(EDE)=0F016H,(TONI)=01114H

圖4-3絕對尋址指令執(zhí)行過程

例如:

ResetMOV#2345H,R6;

AAAMOVR6,R7;

SUB&AAA,&Reset ;將地址Reset中的數(shù)據(jù)減去地址AAA中的數(shù)據(jù),再將結(jié)果

;送達地址Reset中

執(zhí)行前:Reset=0E000H,(0E000H)=4036H

AAA=0E004H,(0E004H)=4607H

執(zhí)行后:(0E000H)=4036H-4607H=FA2FH

這種尋址模式既可用于源操作數(shù),又可用于目的操作數(shù)。下面的語句都屬于絕對尋址模式:

MOV#2345H,&Reset ;目的操作數(shù)絕對尋址

MOV&Reset,R5 ;源操作數(shù)絕對尋址

MOV&AA,&234H ;源操作數(shù)絕對尋址

MOVR9,&AA ;目的操作數(shù)絕對尋址

4.2.5間接尋址

這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在寄存器中,格式如下:

解釋:將地址R10單元中的內(nèi)容移動到R11中的內(nèi)容為地址的單元中。R10和R11中的內(nèi)容在執(zhí)行前后不變(見圖4-4)。

圖4-4間接尋址指令執(zhí)行過程

間接尋址中源操作數(shù)或目的操作數(shù)涉及的寄存器內(nèi)容在執(zhí)行前后不變。這種尋址方式只適用于源操作數(shù),對于目的操作數(shù)用變址尋址操作0(Rd)代替,例如:

MOV@R5,R6;

MOV@R6,4(R7);

4.2.6間接增量尋址

這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在寄存器中,格式如下:

解釋:以R10里的內(nèi)容為地址,將該地址單元中的內(nèi)容送到以R11里的內(nèi)容為地址的地址單元中。然后將R10中的內(nèi)容加2,R11中的內(nèi)容不變(見圖4-5)。

圖4-5間接增量尋址指令執(zhí)行過程

在間接增量尋址方式中,源寄存器的內(nèi)容在執(zhí)行后自動加2(字操作)或1(字節(jié)操作),目的寄存器內(nèi)容不變,如圖4-6所示。

圖4-6間接增量尋指指令執(zhí)行框圖

這種尋址方式適合于對表進行隨機訪問。間接增量尋址方式只對源操作數(shù)有效,此時目的寄存器內(nèi)容需手動改變(INC/INCD),例如:

MOV@R5+,R6;

MOV@R6+,4(R7);

4.2.7立即尋址

這種尋址方式的操作數(shù)在指令中由源操作數(shù)直接指出,操作數(shù)能夠立即得到,在指令代碼中緊跟操作碼后,格式如下:

圖4-7立即尋址指令執(zhí)行過程

下面的指令都使用了立即尋址模式:

MOV#1212H,R6;

MOV#1212H,2(R6)

MOV#12H,&220H;

4.3指令系統(tǒng)介紹

4.3.1數(shù)據(jù)傳送類指令

(1)MOV:通用數(shù)據(jù)傳送指令。語法:MOVsrc,dst或MOV.Wsrc,

dst/MOV.Bsrc,dst操作:src→dst說明:將源操作數(shù)移至目的操作數(shù),源操作數(shù)不受影響。狀態(tài)位:N,Z,C,V均不受影響。方式位:OSCOFF,CPUOFF和GIE不受影響。

MOV指令能實現(xiàn)多種數(shù)據(jù)傳送的方向,但不是任何尋址方式都可以作為目的操作數(shù)的。數(shù)據(jù)傳送時,可以參照圖4-8,圖中所示數(shù)據(jù)傳送是可以實現(xiàn)的。

圖4-8數(shù)據(jù)傳送的可能方向

例如:

MOV4(R8),R10;

MOV#020H,R9;

MOV&234H,&200H;

MOV#121H,5(R5);

例如:地址表EDE(字?jǐn)?shù)據(jù))的內(nèi)容被復(fù)制到表TOM,地址表的長度為020H。

MOV#EDE,R10 ;準(zhǔn)備指針

MOV#020H,R9 ;準(zhǔn)備計數(shù)器

LOOPMOV@R10+,TOM-EDE-2(R10) ;將R10中指針用于兩個表

DECR9 ;計數(shù)器減1

JNZLOOP ;計數(shù)器≠0,繼續(xù)復(fù)制

(2)*CLR:清零指令。

語法:CLRdst或CLR.Wdst/CLR.Bdst

操作:0→dst

說明:清除目的操作數(shù)。

狀態(tài)位:不影響狀態(tài)位。

仿真:

MOV#0,dst

CLRR6;

CLR&TONI;

CLR@R5;

CLRdirect;

(3)*POP:出棧指令。

語法:POPdst/POP.Bdst

操作:@SP→temp,SP+2→SP,temp→dst

說明:堆棧指針(TOS)指向的棧區(qū)字移至目的操作數(shù),隨后堆棧的指針增加2。

仿真:MOV@SP+,dst或MOV.W@SP+,dst或MOV.B@SP+,dst

狀態(tài)位:N,Z,C,V均不受影響。

目的操作數(shù)可以有4種尋址方式。例如:

POP.BR7;

POPR12;

POP5(R9);

POP&234H;

POPSR;

(4)PUSH:入棧指令,內(nèi)核指令。

語法:PUSHsrc或PUSH.Wsrc/PUSH.Bsrc

操作:SP-2→SP,src→@SP

說明:堆棧指針減2,然后操作數(shù)移至由此指針(TOS)尋址的RAM字。

狀態(tài)位:N,Z,C,V均不受影響。

例如:

PUSH.B&TCDAT ;保存8位外設(shè)模塊的數(shù)據(jù)

PUSHSR ;保存狀態(tài)寄存器

(5)SWPB:交換字節(jié)指令,內(nèi)核指令。

語法:SWPBdst

操作:位15~8?位7~0

說明:目的操作數(shù)的高位字節(jié)和低位字節(jié)互換(字操作)。

狀態(tài)位:N,Z,C,V均不受影響。

例如:

MOV#2300H,R5;

SWPBR5;

執(zhí)行后:(R5)=0023H

(6)SXT:擴展符號指令。

語法:SXTdst

操作:位7→位8→…→位15

說明:低位字節(jié)的符號擴展到高位字節(jié)(字操作指令);位7的數(shù)據(jù)送到位8~位15(見圖4-9)。

圖4-9擴展符號指令操作示意圖

狀態(tài)位:N結(jié)果為負時置位,為正時復(fù)位;

Z結(jié)果位0時置位,不為0時復(fù)位;

C結(jié)果為非零時置位,其它情況時復(fù)位;

V復(fù)位。

例如:

MOV#7F45H,R5;

SXTR5;

執(zhí)行結(jié)果:(R5)=0045H

4.3.2數(shù)據(jù)運算類指令

MSP430系列單片機指令系統(tǒng)主要有加法運算指令和減法運算指令兩類數(shù)據(jù)運算指令。這兩類指令一般都影響標(biāo)志位。

1.加法指令

(1)ADD:源操作數(shù)和目的操作數(shù)相加,為內(nèi)核指令。

語法:ADDsrc,dst或

ADD[.W]src,dst/ADD.Bsrc,dst

操作:src+dst→dst說明:源操作數(shù)和目的操作數(shù)相加,結(jié)果存入目的操作數(shù),源操作數(shù)不受影響,目的操作數(shù)以前的數(shù)據(jù)丟失。

狀態(tài)位:N結(jié)果為負時置位,為正時復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果產(chǎn)生進位時置位,否則復(fù)位;

V發(fā)生算術(shù)溢出時置位,否則復(fù)位。

例如:

ADD#1232H,R7;

ADDR8,R5;

目的操作數(shù)可以是任意通用寄存器和存儲器(適用于目的操作數(shù)的所有尋址方式),例如:

ADD#data,Rn;

ADDRn,Rn;

ADD@Rn,direct;

ADD@Rn+,direct;

ADDdirect1,direct;

ADD#data,&TONI;

ADDX(Rn),&TONI;

ADD&EDE,&TONI;

ADD@Rn+,X(Rn);

ADDX(Rn),X(Rn);

ADDdirect1,X(Rn);

(2)ADC:將進位位加至目的操作數(shù)。

語法:ADCdst或ADC.Wdst/ADC.Bdst

操作:dst+C→dst

說明:進位C和目的操作數(shù)相加,結(jié)果存在目的操作數(shù)中,操作數(shù)以前的數(shù)據(jù)丟失。

仿真:ADDC#0,dst;

ADDC.B#0,dst;

狀態(tài)位:N結(jié)果為負時置位,為正時復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果產(chǎn)生進位時置位,否則復(fù)位;

V發(fā)生算術(shù)溢出時置位,否則復(fù)位。

例如:

ADC.B@R10,0(R12);

ADC.B1(R12);

(3)?ADDC:帶進位的加法指令。

語法:ADDCsrc,dst或ADDC.Wsrc,dst/ADDC.Bsrc,dst

操作:src+dst+C→dst

說明:源操作數(shù)、進位C和目的操作數(shù)相加,結(jié)果存在目的操作數(shù)中,源操作數(shù)不受影響,目的操作數(shù)以前的數(shù)據(jù)丟失。該指令和ADD指令類似,只是在兩個操作數(shù)相加時,要把進位標(biāo)志C的值加上去,結(jié)果送到目的操作數(shù)中。

狀態(tài)位:N結(jié)果為負時置位,為正時復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果的MSB產(chǎn)生進位時置位,否則復(fù)位;

V發(fā)生算術(shù)溢出時置位,否則復(fù)位。

ADDC可以實現(xiàn)立即數(shù)、寄存器、存儲單元的內(nèi)容和寄存器相加,結(jié)果存到寄存器中。ADDC還可以實現(xiàn)立即數(shù)、寄存器、存儲單元的內(nèi)容和另外的存儲單元內(nèi)容相加,結(jié)果保存到目的存儲單元中。源操作數(shù)可用所有的7種尋址方式,目的操作數(shù)也可以應(yīng)用4種尋址方式。

例:兩個32位的數(shù)據(jù)分別放在起始地址220H和230H中,相加后和存放在240H開始的地址中。

ADD&220H,&230H ;對應(yīng)低位字相加

MOV&230H,&240H ;保存低位和

ADDC&222H,&232H ;高位相加的時候要加上低位的進位

MOV&232H,&242H ;保存高位和

MOV#0,&244H ;清除&244H單元,為保存高位進位做準(zhǔn)備

ADDC#0,&244H ;保存高位進位

(4)DADD:帶進位的BCD數(shù)相加指令。

語法:DADDsrc,dst或DADD.Wsrc,dst/DADD.Bsrc,dst

操作:dst+src+C→dst

說明:源操作數(shù)和目的操作數(shù)被當(dāng)作4個帶符號的十進制(BCD)數(shù),十進制源操作數(shù)和進位C加至目的操作數(shù),源操作數(shù)不變,目的操作數(shù)以前的數(shù)據(jù)丟失。

狀態(tài)位:NMSB為1時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果大于9999(或大于99)時置位;

V不變。

DADD指令類似ADDC指令,只是操作數(shù)性質(zhì)不一樣,前者為BCD數(shù),后者為二進制數(shù)。DADD指令進行加法運算時,由于不需要進行二進制到BCD數(shù)的轉(zhuǎn)換,因此會節(jié)省時間和ROM空間。

例:R5和R6中的8位十進制加至R3和R4中的8位十進制數(shù)(R4和R3含有MSBs)。

CLRC ;清除進位位

DADDR5,R3 ;加LSDs

DADDR6,R4 ;帶進位位加MSDs

JCOVERFLOW ;若產(chǎn)生進位,則轉(zhuǎn)移至錯誤處理子程序

(5)*DADC:將十進制的進位加至目的操作數(shù)。

語法:DADCdst或DADC.Wsrc,dst/DADC.Bdst

操作:dst+C→dst

說明:進位位C和目的操作數(shù)相加,結(jié)果存到目的操作數(shù)。

仿真:DADD#0,dst;

狀態(tài)位:NMSB為1時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C目的操作數(shù)從9999增至0000時(或從99增至00)置位,否則復(fù)位;

V不變。

DADC指令類似ADC指令,只是操作數(shù)的性質(zhì)不一樣,前者為BCD數(shù),后者為二進制數(shù)。

例:R5中的4位十進制數(shù)加至R8指向8位十進制數(shù)。

CLRC

DADDR5,0(R8);

DADC2(R8);

(6)*INC:目的操作數(shù)加1。

語法:INCdst或INC.Wdst/INC.Bdst

操作:dst+1→dst

說明:完成目的操作數(shù)加1。

仿真:ADD#1,dst

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果包含0FFFFH(或包含0FFH)時置位,否則復(fù)位;

C結(jié)果包含0FFFFH(或包含0FFH)時置位,否則復(fù)位;

V結(jié)果包含07FFFH(或包含07FH)時置位,否則復(fù)位。

目的操作數(shù)可以采用寄存器尋址、絕對尋址和變址尋址三種方式:

INCRn;

INCX(Rn);

INC&EDE;

INCDirect;

此指令一般用在循環(huán)程序中修改地址指針和循環(huán)次數(shù)。

例:將R6指向的100個字傳送到R7所指向的100個連續(xù)字地址空間。

MOV#100,R8 ;傳送的字?jǐn)?shù)

TRANS MOV@R6+,0(R7) ;對應(yīng)單元開始傳送

INCR7;

INCR7;字操作,調(diào)整R7所指向的單元

DECR8;每傳送完一個字,傳送字?jǐn)?shù)減1

JNZTRANS;沒有傳送完,繼續(xù)

… ;傳送完畢

(7)*INCD:目的操作數(shù)增2。

語法:INCDdst或INCD.Wdst/INCD.Bdst

操作:dst+2→dst

說明:目的操作數(shù)加2送回到目的操作數(shù)。

仿真:ADD#2,dst或ADD.B#2,dst

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果包含0FFFEH(包含0FEH)時置位,否則復(fù)位;

C結(jié)果包含0FFFEH或0FFFFH(包含0FEH或0FFH)時置位,否則復(fù)位;

V結(jié)果包含07FFEH或07FFFH(包含07EH或07FH)時置位,否則復(fù)位。

例如:

INCDSP;

INCD.B0(SP);

2.減法指令

表4-7MSP430的減法指令

(1)SUB:從目的操作數(shù)中減去源操作數(shù)。

語法:SUBsrc,dst或SUB.Wsrc,dst/SUB.Bsrc,dst

操作:dst+.NOT.src+1→dst或dst-src→dst

說明:從目的操作數(shù)中減去源操作數(shù),結(jié)果存在目的操作數(shù)中,即將源操作數(shù)求反加上1,然后再加上目的操作數(shù),結(jié)果送目的操作數(shù),源操作數(shù)內(nèi)容不變。

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果的MSB產(chǎn)生進位時置位,否則復(fù)位,即無借位時置為1,有借位時

復(fù)位。借位被視為一種非進位:

借位

進位位

0

1

V發(fā)生算術(shù)溢出時置位,否則復(fù)位。

目的操作數(shù)可以是寄存器或者存儲單元,源操作數(shù)可以用所有的7種尋址方式,該指令即適用于字操作,又適用于字節(jié)操作。

例如:SUBR7,R8;

執(zhí)行前:(R8)=23F6H,(R7)=4120H;

執(zhí)行后:(R8)=E2D6H,(R7)=4120H,(C)=0(有借位)。

SUB@R7,R8;

執(zhí)行前:(R8)=23F6H,(R7)=220H,(220H)=1112H;

執(zhí)行后:(R8)=12E4H,(R7)=220H,(220H)=1112H,(C)=1(無借位)。

SUB#5FE6H,direct;

執(zhí)行前:(direct)=220H,(220H)=0FFFFH;

執(zhí)行后:(direct)=220H,(220H)=0AD19H,(C)=1(無借位)。

SUB2(R7),&TONI;

執(zhí)行前:(R7)=230H,(232H)=0E00FH,TON1=240H,(240H)=1D57H;

執(zhí)行后:(R7)=230H,(232H)=0E00FH,(240H)=03D48H,(C)=0(有借位)。

SUB@(R7)+,2(R8);

執(zhí)行前:(R8)=230H,(R7)=210H,(210H)=1009H,(232H)=3FF0H;

執(zhí)行后:(R8)=230H,(R7)=212H,(210H)=1009H,(232H)=2FE7H,(C)=1(無借位)。

(2)SUBC,SBB:帶借位的減法指令。

語法:SUBCsrc,dst或SUBC.Wsrc,dst/SUBC.Bsrc,dst

SBBsrc,dst或SBB.Wsrc,dst/SBB.Bsrc,dst

操作:dst+.NOT.src+C→dst或(dst-src-1+C→dst)

說明:從目的操作數(shù)中減去源操作數(shù),具體方法是將源操作數(shù)求反再加上進位C,源操作數(shù)不受影響,結(jié)果存入目的操作數(shù)。

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果的MSB產(chǎn)生進位時置位,否則復(fù)位,無借位時置1,有借位時為0;

V發(fā)生算術(shù)溢出時置位,否則復(fù)位。

該指令的目的操作數(shù)可以是寄存器或者存儲單元。源操作數(shù)可以用所有的7種尋址方式,該指令既適用于字操作,又適用于字節(jié)操作。該指令在減法操作中的功能類似于ADDC指令在加法操作時的功能,都是用于多字節(jié)(字)的運算。進行高位運算時要考慮低位的進位(加法)或者借位(減法)。

例如:

SUB.WR13,R10;

SUBC.BR12,R9;

SUB.B@R13+,R10;

SUBC.B@R12,R11;

(3)*SBC:從目的操作數(shù)中減去借位。

語法:SBCdst或SBC.Wdst/SBC.Bdst

操作:dst+0FFFFH+C→dst

dst+0FFH+C→dst

說明:進位C加到減1后的目的操作數(shù),結(jié)果存入目的操作數(shù)。

仿真:SUBC#0,dst或SUBC.B#0,dst

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

Cdst從0000H減至0FFFFH(或從00減至0FFH)時復(fù)位,其它情況下置位;

V初始C=0且dst=08000H(或dst=080H)時置位,其它情況下復(fù)位。

同理,借位可視為非進位1。

例如:SUB@R13,0(R12);

SBC2(R12);

(4)

*DEC:目的操作數(shù)減1。

語法:DECdst或

DEC.Wdst/DEC.Bdst

操作:dst-1→dst

仿真:SUB#1,dst或SUB.B#1,dst

說明:目的操作數(shù)減1,結(jié)果存入目的操作數(shù)。

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z目的操作數(shù)初值為1時置位,否則復(fù)位;

C目的操作數(shù)初值為0時復(fù)位,否則置位;

V產(chǎn)生算術(shù)溢出時置位,否則復(fù)位,目的操作數(shù)的初始值為08000H(或080H)時置位,否則復(fù)位。

例4.1

將R6指向的100個字傳送到R7所指向的100個連續(xù)的字地址空間。

MOV#100,R8;傳送的字的個數(shù)(循環(huán)指針)送入R8

TRANSMOV@R6+,0(R7);對應(yīng)單元開始傳送

INCDR7 ;字操作,調(diào)整R7所指向的單元

DECR8 ;每傳送完畢一個字,傳送字的個數(shù)減1(修改循環(huán)指針)

JNZTRANS ;沒有傳送完,繼續(xù)

… ;傳送完畢

例4.2

將R10減1。

DECR10 ;R10減1;

;將從EDE開始的255字節(jié)存儲區(qū)塊移到從TONI開始的存儲區(qū)

;地址表不能重疊:目的地址TONI的起點不能位于EDE~EDE+0FEH的

;范圍內(nèi)

MOV#EDE,R6

MOV#255,R10

L$1MOV.B@R6+,TONI-EDE-1(R6)

DECR10

JNZL$1例4.2程序執(zhí)行示意圖如圖4-10所示。

圖4-10例4.2程序執(zhí)行示意圖

例4.3

將地址LEO處的存儲器字節(jié)減1。

DEC.BLEO ;MEM(LEO)減1

;將從EDE開始的255字節(jié)存儲區(qū)塊移到從TONI開始的存儲區(qū),地址表不能

;重疊,目的地址TONI的起點不能位于EDE~EDE+0FEH的范圍內(nèi)

MOV#EDE,R6

MOV#255,LEO

LS2MOV.B@R6+,TONI-EDE-1(R6)

DEC.BLEO

JNZLS2

(5)

*DECD:目的操作數(shù)減2。

語法:DECDdst或DECD.Wdst/DECD.Bdst

操作:dst-2→dst

仿真:SUB#2,dst或SUB.B#2,dst

說明:目的操作數(shù)減2,結(jié)果存入目的操作數(shù)。

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Zdst包含2時置位,否則復(fù)位;

Cdst包含0或1時復(fù)位,否則置位;

V發(fā)生算術(shù)溢出時置位,否則復(fù)位;目的操作數(shù)的初始值為08000H或08001H時置位,否則復(fù)位;目的操作數(shù)的初始值為080H或081H時置位,否則復(fù)位。

例4.4R10減2。

DECDR10 ;R10減2

;將從EDE開始的255字節(jié)存儲區(qū)塊移到從TONI開始的存儲區(qū),地址表

;不能重疊,目的地址TONI的起點不能位于EDE~EDE+0FEH的范圍內(nèi)

MOV#EDE,R6

MOV#510,R10

LS2MOV.B@R6+,TONI-EDE-2(R6)

DECDR10

JNZLS2

例4.5

地址LEO處的存儲器減2。

DECD.BLEO ;MEM(LEO)減2

DECD.BSTATUS ;狀態(tài)字節(jié)STATUS減2。

(6)CMP:比較源操作數(shù)和目的操作數(shù)。

語法:CMPsrc,dst或CMP.Wsrc,dst/CMP.Bsrc,dst

操作:dst+.NOT.src+1或(dst-src)

說明:從目的操作數(shù)中減去源操作數(shù),即將源操作數(shù)求反再加上1。源操作數(shù)和目的操作數(shù)內(nèi)容不變,不保存結(jié)果,只是影響狀態(tài)位。

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位(src≥dst);

Z結(jié)果為0時置位,否則復(fù)位(src=dst);

C結(jié)果的MSB產(chǎn)生進位時置位,否則復(fù)位;

V發(fā)生算術(shù)溢出時置位,否則復(fù)位。

比較指令通常用于比較兩個數(shù)之間的關(guān)系,即判斷兩者的大小或是否相等。在比較指令之后,零標(biāo)志可判別兩者是否相等,若兩者不等,則可利用比較指令之后的標(biāo)志位的狀態(tài)來確定兩者的大小。設(shè)A,B是參與比較的兩個數(shù),利用A-B進行比較操作:

若兩者相等,則相減以后結(jié)果為0,Z=1,否則Z=0;

兩個無符號數(shù)相比較時,用借位標(biāo)志C來確定兩者的大小。C=0則A>B;C=1則A<B。

兩個有符號數(shù)相比較時,用溢出標(biāo)志和負標(biāo)志來確定兩者的大小,方法如下:

在沒有溢出的情況下,即V=0時,若N=0,則A>B;若N=1,則A<B。

在發(fā)生溢出的情況下,即V=1時,若N=1,則A>B;若N=0,則A<B。

例4.6

比較兩個RAM塊,如果不等,程序跳轉(zhuǎn)到標(biāo)號ERROR。

MOV#NUM,R5;被比較數(shù)據(jù)塊的長度送入R5

L$1

CMP&BLOCK1,&BLOCK2 ;兩數(shù)據(jù)塊中的數(shù)據(jù)進行比較

JNZERROR;不等,則跳轉(zhuǎn)到ERROR

DECR5 ;修改數(shù)據(jù)塊長度指針

JNZL$1 ;判斷比較完否,否則進行另一次比較

(1)AND:源操作數(shù)和目的操作數(shù)“與”。

語法:ANDsrc,dst或AND.Wsrc,dst/AND.Bsrc,dst

操作:src.AND.dst→dst

說明:源操作數(shù)和目的操作數(shù)邏輯與,其結(jié)果放入目的操作數(shù)。

狀態(tài)位:N結(jié)果的MSB為1時置位,為0時復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果不為0時置位,其他情況時不受影響(=.NOT.Zero);

V復(fù)位。

邏輯操作指令是按位進行的,所以“AND”指令常用來屏蔽字節(jié)中的某些位,該位欲清除用“0”去“與”,該位欲保留用“1”去“與”。

例4.9ANDR7,R8

執(zhí)行前:(R8)=23F6H,(R7)=0FF00H;

執(zhí)行后:(R8)=2300H,(R7)=0FF00H。

AND@R7,R8

執(zhí)行前:(R8)=23F6H,(R7)=220H,(220H)=1112H;

執(zhí)行后:(R8)=0112H,(R7)=220H;(220H)=1112H。

AND#56FFH,direct

執(zhí)行前:(direct)=210H,(210H)=132FH;

執(zhí)行后:(direct)=210H,(210H)=122FH。

AND2(R7),&TONI執(zhí)行前:(R7)=230H,(232H)=0E00FH,TONI=240H,(240H)=1D57H;

執(zhí)行后:(R7)=230H,(232H)=0E00FH,TONI=240H,(240H)=0007H。

AND@(R7)+,2(R8)

執(zhí)行前:(R7)=220H,(220H)=1009H,R8=230H,(232H)=3FF0H;

執(zhí)行后:(R7)=222H,(220H)=1009H,R8=230H,(232H)=1000H。

(2)

BIC:清零目的操作數(shù)的各位。

語法:BICsrc,dst或BIC[.W]src,dst/BIC.Bsrc,dst

操作:.NOT.src.AND.dst→dst

說明:求反后的源操作數(shù)和目的操作數(shù)作邏輯相與,其結(jié)果放入目的操作數(shù),源操作數(shù)將不受影響,只是在運算的中間過程中利用其取反的值參與運算。

狀態(tài)位:N,Z,C,V均不受影響。

例4.11

BIC@R7,R8

執(zhí)行前:(R8)=23F6H,(R7)=220H,(220H)=0FFFFH;

執(zhí)行后:(R8)=0000H,(R7)=220H,(220H)=0FFFFH。

BIC#0F00H,direct

執(zhí)行前:(direct)=220H,(220H)=0FFFFH;

執(zhí)行后:(direct)=220H,(220H)=0F0FFH。

BIC2(R7),&TONI

執(zhí)行前:(R7)=230H,(232H)=0E0FH,(TONI)=1D57H;

執(zhí)行后:(R7)=230H,(232H)=0E0FH,(TONI)=1150H。

例4.12

將從EDE開始的255字節(jié)存儲區(qū)塊移到從TONI開始的存儲區(qū),地址表不能重疊。目的地址TONI的起點不能位于EDE~EDE+0FEH的范圍內(nèi)。

MOV #EDE,R6;

MOV.B #255,LEO;

LS4 MOV.B@R6+,TONI-EDE-1(R6);

DEC.B LEO;

JNZ

LS4;

(3)BIS:設(shè)置目的操作數(shù)的各位。

語法:BISsrc,dst或BIS[.W]src,dst/BIS.Bsrc,dst

操作:src.OR.dst→dst

說明:源操作數(shù)和目的操作數(shù)作邏輯或,結(jié)果放入目的操作數(shù),源操作數(shù)不受影響。

狀態(tài)位:N,Z,C,V均不受影響。

邏輯“或”運算可用于對某一操作數(shù)中的若干位維持不變,而另外若干位置為1的場合。欲保留(不變)的位用“0”去“或”,而要置位的用“1”去“或”。利用“或”運算,可以對兩個操作數(shù)進行組合,也可以對某些位置位。

例4.13BIS#0F00FH,R7;

執(zhí)行前:(R7)=1230H;

執(zhí)行后:(R7)=0F23FH。

BIS@R7,R6;

執(zhí)行前:(R6)=0F00AH,(R7)=220H,(220H)=1DD5H;

執(zhí)行后:(R7)=220H,(220H)=1DD5H,(R6)=0FDDFH。

(4)BIT:測試目的操作數(shù)的各位。

語法:BITsrc,dst或BIT.Wsrc,dst/BIT.Bsrc,dst

操作:src.AND.dst

說明:源操作數(shù)和目的操作數(shù)作邏輯與,其結(jié)果僅影響狀態(tài)位,源操作數(shù)和目的操作數(shù)不受影響。

狀態(tài)位:N結(jié)果的MSB為1時置位,為0時復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果不為0時置位,否則復(fù)位;

V復(fù)位。

這條指令通常是用于檢測一些條件是否滿足,但又不希望改變原有的操作數(shù)的情況。通??梢栽谶@條指令之后安排一條條件轉(zhuǎn)移指令。

例4.14

如果R8中的位9被置位,程序轉(zhuǎn)移到標(biāo)號語句TOM處。

BIT#0200H,R8 ;R8的位9是否被置位

JNZTOM ;是,則轉(zhuǎn)移到標(biāo)號TOM處

;否,則繼續(xù)

(5)XOR:源操作數(shù)和目的操作數(shù)“異或”。

語法:XORsrc,dst或XOR.Wsrc,dst/XOR.Bsrc,dst

操作:src.XOR.dst→dst

說明:源操作數(shù)和目的操作數(shù)“異或”,其結(jié)果放入目的操作數(shù),源操作數(shù)不受影響。

狀態(tài)位:N結(jié)果的MSB為1時置位,為0時復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C結(jié)果不為0時置位,否則復(fù)位;

V兩個操作數(shù)均為負時置位。

“異或”運算常用于對某一操作數(shù)中的某些位取反,其它位不變。對欲保留不變的那些位是用“0”去“異或”,而對要取反的那些位用“1”去“異或”。

例4.15

XOR@R7,R8

執(zhí)行前:(R8)=23F6H,(R7)=220H,(220H)=0FFFFH;

執(zhí)行后:(R8)=0DC09H,(R7)=220H,(220H)=0FFFFH。

XOR#0FF22H,direct

執(zhí)行前:(direct)=220H,(220H)=5F00H;

執(zhí)行后:(direct)=220H,(220H)=0A022H。

XOR2(R7),&TONI

執(zhí)行前:(R7)=230H,(232H)=0E0FH,(TONI)=1D57H;

執(zhí)行后:(R7)=230H,(232H)=0E0FH,(TONI)=1358H。

(6)*INV:目的操作數(shù)求反。

語法:INVdst/INV.Bdst

操作:.NOT.dst→dst

說明:目的操作數(shù)取反,以前的數(shù)據(jù)丟失。

仿真:XOR#0FFFFH,dst或XOR.B#0FFH,dst

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Zdst包含0FFFFH(或0FFH)時置位,否則復(fù)位;

C結(jié)果不為0時置位,否則復(fù)位;

V初始目的操作數(shù)為負時置位,否則復(fù)位。

例4.16INVR8

執(zhí)行前:(R8)=23F6H;

執(zhí)行后:(R8)=0DC09H。

INV@R7

執(zhí)行前:(R7)=220H,(220H)=5F00H;

執(zhí)行后:(direct)=220H,(220H)=0A0FFH。

2.移位指令

(1)*RLA:算術(shù)循環(huán)左移。

語法:RLAdst或RLA.Wdst/RLA.Bdst

操作:C←MSB←MSB-1←…LSB+1←LSB←0

說明:目的操作數(shù)左移一位,MSB成為進位位C,LSB填0,RLA指令可將操作數(shù)左移一位,相當(dāng)于將該操作數(shù)乘2。在執(zhí)行該操作前,如果03FFFH<dst<0C000H(如果是字節(jié)操作,03FH<dst<0C0H),則產(chǎn)生溢出,結(jié)果會改變符號。

仿真:ADDdst,dst或ADD.Bdst,dst

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C從MSB獲取;

V如產(chǎn)生算術(shù)溢出,則03FFFH<dst<0C000H(或03FH<dst<0C0H)時置位,否則復(fù)位。

例4.17RLAR7執(zhí)行前:(R7)=0123H,C=1;執(zhí)行后:(R7)=0246H,C=0。

例4.18RLCR7

執(zhí)行前:(R7)=0123H,C=1;

執(zhí)行后:(R7)=0247H,C=0。

(3)RRA:算術(shù)循環(huán)右移。

語法:RRAdst或RRA.Wdst/RRA.Bdst

操作:MSB→MSB,MSB→MSB-1,MSB-1→MSB-2,…,LSB+1→LSB,LSB→C

說明:目的操作數(shù)右移一位,但保持符號不變,最低位移至進位位C,MSB移入MSB,MSB移入MSB-1,MSB-1移入MSB-2,LSB+1移入LSB。

狀態(tài)位:N結(jié)果為負時置位,否則為復(fù)位;

Z結(jié)果為0時置位,否則為復(fù)位;

C從LSB獲??;

V復(fù)位。

例4.19

RRAR7

執(zhí)行前:(R7)=8122H,C=0;執(zhí)行后:(R7)=0C091H,C=0,N=1。

(4)RRC:帶進位位循環(huán)右移。

語法:RRCdst或RRC.W/dstRRC.Bdst

操作:C→MSB→MSB-1→…→LSB+1→LSB→C

說明:目的操作數(shù)內(nèi)容循環(huán)右移,進位位C移入MSB,目的操作數(shù)各位均右移一位,LSB移入進位位C。

狀態(tài)位:N結(jié)果為負時置位,否則復(fù)位;

Z結(jié)果為0時置位,否則復(fù)位;

C從LSB獲??;

V初始目的操作數(shù)為正且初始進位位被置位時置位,否則復(fù)位。

RRCR7執(zhí)行前:(R7)=0BFFFH,N=0,C=1;執(zhí)行后:(R7)=0DFFFH,N=1,C=1。RRC&220H執(zhí)行前:(220H)=0A5A5H,N=0,C=0;

執(zhí)行后:(R8)=52D2H,N=0,C=1。

4.3.4位操作類指令

MSP430指令系統(tǒng)的位操作指令能夠完成對負標(biāo)志、進位標(biāo)志、零標(biāo)志和中斷標(biāo)志位進行清零和置位操作。

(1)*CLRC:清除進位位。

語法:CLRC

操作:0→C

說明:使進位位C清零。

仿真:BIC#1,SR

狀態(tài)位:N,Z,V不受影響,C=0。

(2)*CLRN:清除負位。

語法:CLRN

操作:0→N或.NOT.src.AND.dst→dst

說明:使負標(biāo)志位N清零。

仿真:BIC#4,SR

狀態(tài)位:Z,C,V不受影響,N=0。

(3)*CLRZ:清除零位。

語法:CLRZ

操作:0→Z或.NOT.src.AND.dst→dst

說明:使零標(biāo)志位Z清零。

仿真:BIC#2,SR

狀態(tài)位:N,C,V不受影響,Z=0。

(4)*SETC:置位進位位。

語法:SETC

操作:1→C

說明:使進位位C置位(常用操作)。

仿真:BIS#1,SR

狀態(tài)位:N,Z,V不受影響,C=1。

(5)*SETN:置位負標(biāo)志位。

語法:SETN

操作:1→N

說明:使負標(biāo)志位N置位。

仿真:BIS#4,SR

狀態(tài)位:Z,C,V不受影響,N=1。

(6)*SETZ:置位零標(biāo)志位。

語法:SETZ

操作:1→Z

仿真:BIS#2,SR

說明:使零標(biāo)志位Z置位。

狀態(tài)位:N,C,V不受影響,Z=1。

(7)*DINT:禁止可屏蔽中斷。

語法:DINT

操作:0→GIE或(0FFF7H.AND.SR→SR/.NOT.src.AND.dst→dst)

說明:使控制標(biāo)志GIE清零,禁止所有中斷。

仿真:BIC#8,SR

狀態(tài)位:N,Z,C,V不受影響。

(8)*EINT:使能可屏蔽中斷。

語法:EINT

操作:1→GIE或(0008H.OR.SR/.NOT.src.OR.dst→dst)

說明:使控制標(biāo)志位GIE置位,使能所有中斷。

仿真:BIS#8,SR

狀態(tài)位:N,Z,C,V均不受影響。

注意:任何情況下都可以執(zhí)行使能中斷指令EINT后面的指令,甚至在中斷服務(wù)請求懸而未決時也可以執(zhí)行。

例4.20

狀態(tài)寄存器中的一般中斷使能位GIE清零,可允許非中斷移動一個32位數(shù)值,這樣可以保證在任何中斷移動期間,該數(shù)值不會被修改。

DINT ;所有使用GIE位的中斷事件被禁止

MOVCOUNTHI,R5 ;復(fù)制數(shù)值

MOVCOUNTLO,R6

EINT ;所有使用GIE位的中斷事件被使能

4.3.5跳轉(zhuǎn)與程序流程的控制類指令

MSP430指令系統(tǒng)可執(zhí)行跳轉(zhuǎn)與程序流程控制的指令,采用和其它指令相同的尋址方式,非常適合于計算地址以實現(xiàn)分支跳轉(zhuǎn)和子程序調(diào)用。

(1)

*BR,BRANCH:轉(zhuǎn)移至目的操作數(shù)。

語法:BRdst

操作:dst→PC

說明:無條件轉(zhuǎn)移到64KB地址空間的任一地址處,可使用所有的源尋址方式。轉(zhuǎn)移指令是一個字指令。

仿真:MOVdst,PC

狀態(tài)位:不影響狀態(tài)位。

例4.21

給出所有尋址方式的示例

BR#EXEC ;轉(zhuǎn)移到標(biāo)號EXEC或直接轉(zhuǎn)移(例:#0A4H)

BREXEC ;轉(zhuǎn)移到EXEC所包含的地址處執(zhí)行

BR&EXEC ;轉(zhuǎn)移到絕對地址EXEC中包含的地址

BRR5 ;轉(zhuǎn)移到R5中包含的地址處開始執(zhí)行

BR@R5 ;轉(zhuǎn)移到R5指向的字中包含的地址

BR@R5+ ;轉(zhuǎn)移到R5指向的字中包含的地址,然后R5中的指針增1下一次S/W流使用R5指針——它可通過訪問R5指向的地址表中的下一個地址改變程序的執(zhí)行

BRX(R5) ;轉(zhuǎn)移到R5+X指向的地址中包含的地址(例:從X開始的地址表),X可以是一個地址也可以是一個標(biāo)號

(2)

CALL:子程序調(diào)用指令。

語法:CALLdst

操作:dst→tmp;dst被評估和存儲

SP-2→SP

PC→@SP ;將PC更新至TOS

tmp→PC ;將dst保存至PC

說明:調(diào)用64KB地址空間中任意一地址處的子程序,可使用所有的尋址方式。返回地址(后續(xù)指令的地址)存儲在堆棧中,調(diào)用指令是一個字指令。

狀態(tài)位:不影響狀態(tài)位。

例4.22KCALL指令程序舉例。

CALL#EXEC ;調(diào)用標(biāo)號EXEC,直接尋址(例:#0A4H)

;SP-2→SP,PC+2→@SP,@PC+→PC

CALLEXEC ;調(diào)用EXEC中包含的地址,間接尋址

;SP-2→SP,PC+2→@SP,X(PC)→PC

CALL&EXEC;調(diào)用絕對地址EXEC中包含的地址,間接尋址

;SP-2→SP,PC+2→@SP,X(PC)→PC

CALLR5 ;調(diào)用R5中包含的地址

;SP-2→SP,PC+2→@SP,R5→PC

CALL@R5 ;調(diào)用R5指向的字中包含的地址

;SP-2→SP,PC+2→@SP,@R5→PC

CALL@R5+ ;調(diào)用R5指向的字中包含的地址,然后R5中的指針自動增2

;SP-2→SP,PC+2→@SP,@R5→PC

CALLX(R5) ;調(diào)用R5+X指向的地址中包含的地址(例如從X開始的地址表),X可以是一個地址也可以是一個標(biāo)號。

;SP-2→SP,PC+2→@SP,X(R5)→PC

(3)

JC,JHS指令。

JC進位位置位時程序跳轉(zhuǎn)。

JHS大于或等于時程序跳轉(zhuǎn)。

語法:JC標(biāo)號

JHS標(biāo)號

操作:若C=1,PC+2×偏移→PC;

若C=0,順序執(zhí)行下一條指令。

說明:該指令用于測試狀態(tài)寄存器的進位位。如果C被置位,則指令的LSB中包含的10位符號偏移加至程序計數(shù)器;如果C被復(fù)位,則執(zhí)行該指令后面緊隨其后的一條指令。JC用于比較無符號數(shù)(0~65535)(有進位/大于等于時跳轉(zhuǎn))。

狀態(tài)位:N,Z,C,V均不受影響。

(4)JEQ,JZ指令。

JEQ等于時程序跳轉(zhuǎn)。

JZ為零時程序跳轉(zhuǎn)。

語法:JEQ標(biāo)號

JZ標(biāo)號

操作:若Z=1,則PC+2×偏移→PC;

若Z=0,則執(zhí)行下一條指令。

說明:測試狀態(tài)寄存器的零位Z。如果Z被置位,則指令的LSB中包含的10位符號偏移加至程序計數(shù)器;如果Z被復(fù)位,則順序執(zhí)行緊隨其后的下一條指令。

狀態(tài)位:N,Z,C,V均不受影響。

例4.25

若R5中的內(nèi)容為0,則程序轉(zhuǎn)移到地址TONI。

TSTR5 ;測試R5

JZTONI ;若為0,則程序跳轉(zhuǎn)

例4.26

如果R6等于地址表的內(nèi)容,則程序轉(zhuǎn)移到地址LEO。

CMPR6,Table(R5);比較R6和MEM的內(nèi)容(地址表+R5)

JEQLEO;若兩數(shù)相等,則程序跳轉(zhuǎn)

… ;若兩數(shù)不相等,則程序繼續(xù)執(zhí)行

(5)JGE:大于或等于時程序跳轉(zhuǎn)。

語法:JGE標(biāo)號

操作:若(N.XOR.V)=0,程序跳轉(zhuǎn)至標(biāo)號:PC+2×偏移→PC;

若(N.XOR.V)=1,順序執(zhí)行下一條指令。

說明:測試狀態(tài)寄存器的負位N和溢出位V。如果N和V均被置位或復(fù)位,則指令的LSB中包含的10位符號偏移加至程序計數(shù)器;如果N和V其中之一被復(fù)位,則順序執(zhí)行緊隨其后的下一條指令。該指令允許比較符號整數(shù)。

溫馨提示

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

評論

0/150

提交評論