版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)售后售后服務(wù)
- 社區(qū)黨員先鋒行動計劃保證書
- 企業(yè)間借款合同范本格式設(shè)計
- 專業(yè)代理記賬服務(wù)合同
- 學(xué)業(yè)成績承諾函保證承諾
- 致愛人的道歉信請求女友原諒
- 點工協(xié)議書格式
- 專業(yè)企業(yè)保證書范文
- 數(shù)據(jù)備份與恢復(fù)合同
- 爆破作業(yè)合同范本模板
- 大眾頂級 輝騰 減振控制的空氣懸架_圖文
- 血液透析??撇僮髁鞒碳霸u分標(biāo)準(zhǔn)
- 電工新技術(shù)介紹(課堂PPT)
- 座板式單人吊具(課堂PPT)
- 托班一日生活情況反饋表
- 機電設(shè)備維護保養(yǎng)技術(shù)
- FLAC3D常用命令
- JGJ_T231-2021建筑施工承插型盤扣式鋼管腳手架安全技術(shù)標(biāo)準(zhǔn)(高清-最新版)
- 畢業(yè)論文(設(shè)計)除雪車工作裝置設(shè)計
- 鏡片加工知識之四研磨
- 核電站1E級電氣設(shè)備鑒定標(biāo)準(zhǔn)技術(shù)經(jīng)驗
評論
0/150
提交評論