版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章MSP430系列單片機(jī)的指令系統(tǒng)與程序設(shè)計(jì)
4.1MSP430指令系統(tǒng)概述
4.2尋址方式
4.3指令系統(tǒng)介紹
4.4匯編語(yǔ)言程序設(shè)計(jì)
4.5C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)
4.6MSP430的開發(fā)環(huán)境
習(xí)題
4.1MSP430指令系統(tǒng)概述
4.1.1匯編語(yǔ)言語(yǔ)句格式程序設(shè)計(jì)語(yǔ)言是實(shí)現(xiàn)人機(jī)交換信息的重要工具。一般來(lái)說(shuō)高級(jí)語(yǔ)言、匯編語(yǔ)言和機(jī)器語(yǔ)言都可以用程序編制。機(jī)器語(yǔ)言是用二進(jìn)制數(shù)表示的機(jī)器指令,能被計(jì)算機(jī)直接識(shí)別并執(zhí)行,但機(jī)器語(yǔ)言不便記憶和理解,書寫時(shí)也容易出錯(cuò)。匯編語(yǔ)言是用助記符來(lái)表示機(jī)器指令的,與機(jī)器碼一一對(duì)應(yīng),便于記憶和理解,易于掌握和使用,與高級(jí)語(yǔ)言相比程序結(jié)構(gòu)緊湊,節(jié)省存儲(chǔ)空間,執(zhí)行效率高。對(duì)于適用于實(shí)時(shí)測(cè)控系統(tǒng)的單片機(jī)來(lái)說(shuō),采用匯編語(yǔ)言編程最為方便。
匯編語(yǔ)言(AssemblyLanguage)是用助記符和標(biāo)號(hào)地址來(lái)編寫程序語(yǔ)言的,直接面向機(jī)器,因機(jī)器而異。匯編語(yǔ)言的語(yǔ)句由四部分組成:標(biāo)號(hào)、操作碼、操作數(shù)和注釋。MSP430單片機(jī)的指令格式如下:
【標(biāo)號(hào)】操作碼,【操作數(shù)】【;注釋】
標(biāo)號(hào):用戶設(shè)定的符號(hào),表示該指令所在的地址。由匯編器將標(biāo)號(hào)翻譯成該行語(yǔ)句的物理地址。標(biāo)號(hào)并非每一個(gè)語(yǔ)句都有,只有在需要時(shí)才使用。書寫時(shí)最左邊對(duì)齊,后面不必用冒號(hào)。
操作碼:指令的操作功能,是任何一個(gè)語(yǔ)句都不可缺少的。
操作數(shù):規(guī)定數(shù)據(jù)的類型和所用的尋址方式。如果有兩個(gè)操作數(shù),則第一個(gè)為源操作數(shù),第二個(gè)為目的操作數(shù),源操作數(shù)和目的操作數(shù)之間用逗號(hào)分隔;如果只有一個(gè)操作數(shù),該操作數(shù)既是源操作數(shù),又是目的操作數(shù)。有的指令也可以沒(méi)有操作數(shù),如NOP指令。
注釋:語(yǔ)句的說(shuō)明部分,它必須用分號(hào)“;”和指令隔開,注解該指令具體完成了什么操作,它是為了方便人們閱讀程序而設(shè)定的。計(jì)算機(jī)在匯編時(shí)對(duì)注釋部分不作處理。
4.1.2指令系統(tǒng)中的符號(hào)說(shuō)明
指令系統(tǒng)中各符號(hào)的含義介紹如下:
(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”或無(wú)后綴表示其為字操作指令,在字操作指令中,存儲(chǔ)器地址一定要對(duì)準(zhǔn)偶數(shù)地址,指令助記符的后綴“.B”表示其為字節(jié)操作指令;
(7)Rn表示R0~R15;
(8)PC/R0為程序計(jì)數(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為負(fù)標(biāo)志,Z為零標(biāo)志,C為進(jìn)位標(biāo)志;
(18)(×)表示某寄存器或某單元中的內(nèi)容;
(19)((×))表示間接尋址單元中的內(nèi)容;
(20)?EDE、TONI、TOM和LEO是一般的符號(hào),它們沒(méi)有特殊的含義。
4.1.3指令的代碼格式
MSP430單片機(jī)指令系統(tǒng)的代碼格式有雙操作數(shù)指令(內(nèi)核指令)代碼格式、單操作數(shù)指令(內(nèi)核指令)代碼格式、條件和無(wú)條件轉(zhuǎn)移指令代碼格式,下面分別進(jìn)行介紹。
1.雙操作數(shù)指令(內(nèi)核指令)
雙操作數(shù)指令由4個(gè)域組成,共16位代碼。
操作碼域,4位[操作碼]。
源域,6位[源寄存器+As]。
字節(jié)操作識(shí)別符,1位[B/W]。
目的域,5位[目的寄存器+Ad]。
2.單操作數(shù)指令(內(nèi)核指令)
單操作數(shù)指令是由2個(gè)主域組成的,共16位代碼。
3.條件和無(wú)條件轉(zhuǎn)移指令(內(nèi)核指令)
該類指令包括2個(gè)主域,共16位代碼。
操作碼域,6位。
跳轉(zhuǎn)偏移域,10位。
轉(zhuǎn)移指令可跳轉(zhuǎn)到相對(duì)于當(dāng)前地址范圍在-511~+512字之間的地址。匯編器計(jì)算出有符號(hào)的偏移,并把它們插入操作碼。
轉(zhuǎn)移類指令不影響狀態(tài)位,當(dāng)發(fā)生轉(zhuǎn)移時(shí),可通過(guò)偏移量改變PC值,公式為
PCnew?=?Pcold?+?2?+?2?×?偏移量
4.1.4無(wú)需ROM補(bǔ)償?shù)姆抡嬷噶?/p>
無(wú)需ROM補(bǔ)償?shù)姆抡嬷噶羁捎镁?jiǎn)指令集仿真,匯編器接收仿真指令,并能夠插入適當(dāng)?shù)膬?nèi)核指令。MSP430指令系統(tǒng)中無(wú)需ROM補(bǔ)償?shù)姆抡嬷噶钊绫?-1所示。
表4-1無(wú)需ROM補(bǔ)償?shù)姆抡嬷噶?/p>
4.1.5指令的時(shí)鐘周期與指令長(zhǎng)度
MSP430的指令執(zhí)行速度(指令所用的時(shí)鐘周期數(shù),這里時(shí)鐘周期指MCLK的周期)和指令長(zhǎng)度(所占用存儲(chǔ)空間)與指令的格式和尋址模式密切相關(guān)。在不同的尋址模式下,CPU尋找操作數(shù)的路徑不一樣,當(dāng)然要占用不同的時(shí)間與不同的存儲(chǔ)空間。表4-2和4-4給出了MSP430指令的時(shí)鐘周期數(shù)和指令長(zhǎng)度,表4-3和表4-5給出了簡(jiǎn)單判定雙操作數(shù)和單操作數(shù)的CPU指令周期方式。
表4-2雙操作數(shù)指令的時(shí)鐘周期數(shù)與指令長(zhǎng)度
表4-3雙操作數(shù)指令執(zhí)行周期
表4-4單操作數(shù)指令的時(shí)鐘周期數(shù)與指令長(zhǎng)度
表4-5單操作數(shù)指令執(zhí)行周期
例如:PUSH#500H;需要4個(gè)時(shí)鐘周期。
對(duì)于跳轉(zhuǎn)類指令,它們的時(shí)鐘周期數(shù)與指令長(zhǎng)度是固定的。條件跳轉(zhuǎn)指令無(wú)論跳轉(zhuǎn)與否都要占用2個(gè)時(shí)鐘周期,指令長(zhǎng)度為1個(gè)字長(zhǎng)。RETI要占用5個(gè)時(shí)鐘周期,指令長(zhǎng)度也是1個(gè)字長(zhǎng)。除了CPU的指令外,CPU還有一些操作也將占用時(shí)間,但不占用存儲(chǔ)空間(因?yàn)椴皇浅绦蛑噶?。它們是以下一些操作:
中斷響應(yīng),占用6個(gè)時(shí)鐘周期;
WDT復(fù)位,占用4個(gè)時(shí)鐘周期;
系統(tǒng)復(fù)位,占用4個(gè)時(shí)鐘周期。
4.2尋
址
方
式
單片機(jī)執(zhí)行程序的過(guò)程是不斷地尋找操作數(shù)并進(jìn)行操作的過(guò)程,尋址方式是指CPU尋找操作數(shù)或操作數(shù)地址的方法。尋址方式是計(jì)算機(jī)的重要性能指標(biāo)之一,也是匯編程序設(shè)計(jì)中最基本的內(nèi)容。尋址方式越多,單片機(jī)指令功能越強(qiáng),靈活性越大。MSP430共有7種尋址方式。其中,源操作數(shù)可用全部的7種方式尋址,目的操作數(shù)有4種尋址方式,它們可以訪問(wèn)整個(gè)地址空間,如表4-6所示。
表4-6尋址方式
4.2.1寄存器尋址
操作數(shù)的地址由寄存器直接給出,寄存器的內(nèi)容就是指令中的操作數(shù),這種尋址方式稱為寄存器尋址。寄存器尋址方式是將源操作數(shù)中的內(nèi)容移到目的操作數(shù),而源操作數(shù)內(nèi)容不變,通常占1到2個(gè)字。源操作數(shù)和目的操作數(shù)都可以用于寄存器尋址。寄存器尋址一般用于對(duì)時(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個(gè)字,格式如下:
圖4-1變址指令執(zhí)行過(guò)程
變址尋址中源操作數(shù)或目的操作數(shù)中涉及的寄存器內(nèi)容在執(zhí)行前后不變。這種尋址方式對(duì)源操作數(shù)和目的操作數(shù)都有效,例如:
MOVR6,3(R8);
MOV5(R6),R7
4.2.3符號(hào)尋址
這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在指令中直接給出,格式如下:
其中,操作數(shù)的地址為EDE和TONI。(EDE)=PC+X,(TONI)=PC+Y。X,Y存在指令的后續(xù)中,匯編程序能自動(dòng)計(jì)算并插入偏移量X和Y。
例如:MOVEDE,TONI;(EDE)=0F016H,(TONI)=01114H
解釋:將地址EDE單元中的內(nèi)容移到地址為TONI的單元中(見圖4-2)。
圖4-2符號(hào)指令執(zhí)行過(guò)程
例如:
MOVTAB,R5;
…
TABDW13F2H,2213H,3ED4H ;將符號(hào)TAB所表示的數(shù)據(jù)作為地址,再將該地址中的
;數(shù)據(jù)送達(dá)R5
執(zhí)行前:R5=43F2H,TAB標(biāo)號(hào)所指示的地址處的數(shù)據(jù)為字13F2H;
執(zhí)行后:R5=13F2H;
這種尋址模式既可用于源操作數(shù),也可用于目的操作數(shù)。下面的語(yǔ)句都屬于符號(hào)尋址模式:
MOV.BR6,LOOP; ;目的操作數(shù)符號(hào)尋址
MOVTAB,&0316H ;源操作數(shù)符號(hào)尋址
MOVR5,TAB ;源操作數(shù)符號(hào)尋址
4.2.4絕對(duì)尋址
這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在指令中直接給出,主要用于定位絕對(duì)的、固定地址的硬件外圍模塊,對(duì)它們絕對(duì)尋址可保證軟件的透明度。絕對(duì)尋址可以看做是當(dāng)PC=0時(shí)的符號(hào)尋址,格式如下:
其中,EDE和TONI為操作數(shù)地址。將地址EDE的內(nèi)容移到地址TON1中,指令后續(xù)字中給出操作數(shù)的地址。
例如:MOV&EDE,&TONI;(EDE)=0F016H,(TONI)=01114H
圖4-3絕對(duì)尋址指令執(zhí)行過(guò)程
例如:
ResetMOV#2345H,R6;
AAAMOVR6,R7;
SUB&AAA,&Reset ;將地址Reset中的數(shù)據(jù)減去地址AAA中的數(shù)據(jù),再將結(jié)果
;送達(dá)地址Reset中
執(zhí)行前:Reset=0E000H,(0E000H)=4036H
AAA=0E004H,(0E004H)=4607H
執(zhí)行后:(0E000H)=4036H-4607H=FA2FH
這種尋址模式既可用于源操作數(shù),又可用于目的操作數(shù)。下面的語(yǔ)句都屬于絕對(duì)尋址模式:
MOV#2345H,&Reset ;目的操作數(shù)絕對(duì)尋址
MOV&Reset,R5 ;源操作數(shù)絕對(duì)尋址
MOV&AA,&234H ;源操作數(shù)絕對(duì)尋址
MOVR9,&AA ;目的操作數(shù)絕對(duì)尋址
4.2.5間接尋址
這種尋址方式的操作數(shù)在內(nèi)存中,操作數(shù)的地址在寄存器中,格式如下:
解釋:將地址R10單元中的內(nèi)容移動(dòng)到R11中的內(nèi)容為地址的單元中。R10和R11中的內(nèi)容在執(zhí)行前后不變(見圖4-4)。
圖4-4間接尋址指令執(zhí)行過(guò)程
間接尋址中源操作數(shù)或目的操作數(shù)涉及的寄存器內(nèi)容在執(zhí)行前后不變。這種尋址方式只適用于源操作數(shù),對(duì)于目的操作數(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í)行過(guò)程
在間接增量尋址方式中,源寄存器的內(nèi)容在執(zhí)行后自動(dòng)加2(字操作)或1(字節(jié)操作),目的寄存器內(nèi)容不變,如圖4-6所示。
圖4-6間接增量尋指指令執(zhí)行框圖
這種尋址方式適合于對(duì)表進(jìn)行隨機(jī)訪問(wèn)。間接增量尋址方式只對(duì)源操作數(shù)有效,此時(shí)目的寄存器內(nèi)容需手動(dòng)改變(INC/INCD),例如:
MOV@R5+,R6;
MOV@R6+,4(R7);
4.2.7立即尋址
這種尋址方式的操作數(shù)在指令中由源操作數(shù)直接指出,操作數(shù)能夠立即得到,在指令代碼中緊跟操作碼后,格式如下:
圖4-7立即尋址指令執(zhí)行過(guò)程
下面的指令都使用了立即尋址模式:
MOV#1212H,R6;
MOV#1212H,2(R6)
MOV#12H,&220H;
4.3指令系統(tǒng)介紹
4.3.1數(shù)據(jù)傳送類指令
(1)MOV:通用數(shù)據(jù)傳送指令。語(yǔ)法:MOVsrc,dst或MOV.Wsrc,
dst/MOV.Bsrc,dst操作:src→dst說(shuō)明:將源操作數(shù)移至目的操作數(shù),源操作數(shù)不受影響。狀態(tài)位:N,Z,C,V均不受影響。方式位:OSCOFF,CPUOFF和GIE不受影響。
MOV指令能實(shí)現(xiàn)多種數(shù)據(jù)傳送的方向,但不是任何尋址方式都可以作為目的操作數(shù)的。數(shù)據(jù)傳送時(shí),可以參照?qǐng)D4-8,圖中所示數(shù)據(jù)傳送是可以實(shí)現(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,地址表的長(zhǎng)度為020H。
MOV#EDE,R10 ;準(zhǔn)備指針
MOV#020H,R9 ;準(zhǔn)備計(jì)數(shù)器
LOOPMOV@R10+,TOM-EDE-2(R10) ;將R10中指針用于兩個(gè)表
DECR9 ;計(jì)數(shù)器減1
JNZLOOP ;計(jì)數(shù)器≠0,繼續(xù)復(fù)制
…
…
(2)*CLR:清零指令。
語(yǔ)法:CLRdst或CLR.Wdst/CLR.Bdst
操作:0→dst
說(shuō)明:清除目的操作數(shù)。
狀態(tài)位:不影響狀態(tài)位。
仿真:
MOV#0,dst
CLRR6;
CLR&TONI;
CLR@R5;
CLRdirect;
(3)*POP:出棧指令。
語(yǔ)法:POPdst/POP.Bdst
操作:@SP→temp,SP+2→SP,temp→dst
說(shuō)明:堆棧指針(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)核指令。
語(yǔ)法:PUSHsrc或PUSH.Wsrc/PUSH.Bsrc
操作:SP-2→SP,src→@SP
說(shuō)明:堆棧指針減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)核指令。
語(yǔ)法:SWPBdst
操作:位15~8?位7~0
說(shuō)明:目的操作數(shù)的高位字節(jié)和低位字節(jié)互換(字操作)。
狀態(tài)位:N,Z,C,V均不受影響。
例如:
MOV#2300H,R5;
SWPBR5;
執(zhí)行后:(R5)=0023H
(6)SXT:擴(kuò)展符號(hào)指令。
語(yǔ)法:SXTdst
操作:位7→位8→…→位15
說(shuō)明:低位字節(jié)的符號(hào)擴(kuò)展到高位字節(jié)(字操作指令);位7的數(shù)據(jù)送到位8~位15(見圖4-9)。
圖4-9擴(kuò)展符號(hào)指令操作示意圖
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,為正時(shí)復(fù)位;
Z結(jié)果位0時(shí)置位,不為0時(shí)復(fù)位;
C結(jié)果為非零時(shí)置位,其它情況時(shí)復(fù)位;
V復(fù)位。
例如:
MOV#7F45H,R5;
SXTR5;
執(zhí)行結(jié)果:(R5)=0045H
4.3.2數(shù)據(jù)運(yùn)算類指令
MSP430系列單片機(jī)指令系統(tǒng)主要有加法運(yùn)算指令和減法運(yùn)算指令兩類數(shù)據(jù)運(yùn)算指令。這兩類指令一般都影響標(biāo)志位。
1.加法指令
(1)ADD:源操作數(shù)和目的操作數(shù)相加,為內(nèi)核指令。
語(yǔ)法:ADDsrc,dst或
ADD[.W]src,dst/ADD.Bsrc,dst
操作:src+dst→dst說(shuō)明:源操作數(shù)和目的操作數(shù)相加,結(jié)果存入目的操作數(shù),源操作數(shù)不受影響,目的操作數(shù)以前的數(shù)據(jù)丟失。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,為正時(shí)復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果產(chǎn)生進(jìn)位時(shí)置位,否則復(fù)位;
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位。
例如:
ADD#1232H,R7;
ADDR8,R5;
目的操作數(shù)可以是任意通用寄存器和存儲(chǔ)器(適用于目的操作數(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:將進(jìn)位位加至目的操作數(shù)。
語(yǔ)法:ADCdst或ADC.Wdst/ADC.Bdst
操作:dst+C→dst
說(shuō)明:進(jìn)位C和目的操作數(shù)相加,結(jié)果存在目的操作數(shù)中,操作數(shù)以前的數(shù)據(jù)丟失。
仿真:ADDC#0,dst;
ADDC.B#0,dst;
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,為正時(shí)復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果產(chǎn)生進(jìn)位時(shí)置位,否則復(fù)位;
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位。
例如:
ADC.B@R10,0(R12);
ADC.B1(R12);
(3)?ADDC:帶進(jìn)位的加法指令。
語(yǔ)法:ADDCsrc,dst或ADDC.Wsrc,dst/ADDC.Bsrc,dst
操作:src+dst+C→dst
說(shuō)明:源操作數(shù)、進(jìn)位C和目的操作數(shù)相加,結(jié)果存在目的操作數(shù)中,源操作數(shù)不受影響,目的操作數(shù)以前的數(shù)據(jù)丟失。該指令和ADD指令類似,只是在兩個(gè)操作數(shù)相加時(shí),要把進(jìn)位標(biāo)志C的值加上去,結(jié)果送到目的操作數(shù)中。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,為正時(shí)復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果的MSB產(chǎn)生進(jìn)位時(shí)置位,否則復(fù)位;
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位。
ADDC可以實(shí)現(xiàn)立即數(shù)、寄存器、存儲(chǔ)單元的內(nèi)容和寄存器相加,結(jié)果存到寄存器中。ADDC還可以實(shí)現(xiàn)立即數(shù)、寄存器、存儲(chǔ)單元的內(nèi)容和另外的存儲(chǔ)單元內(nèi)容相加,結(jié)果保存到目的存儲(chǔ)單元中。源操作數(shù)可用所有的7種尋址方式,目的操作數(shù)也可以應(yīng)用4種尋址方式。
例:兩個(gè)32位的數(shù)據(jù)分別放在起始地址220H和230H中,相加后和存放在240H開始的地址中。
ADD&220H,&230H ;對(duì)應(yīng)低位字相加
MOV&230H,&240H ;保存低位和
ADDC&222H,&232H ;高位相加的時(shí)候要加上低位的進(jìn)位
MOV&232H,&242H ;保存高位和
MOV#0,&244H ;清除&244H單元,為保存高位進(jìn)位做準(zhǔn)備
ADDC#0,&244H ;保存高位進(jìn)位
(4)DADD:帶進(jìn)位的BCD數(shù)相加指令。
語(yǔ)法:DADDsrc,dst或DADD.Wsrc,dst/DADD.Bsrc,dst
操作:dst+src+C→dst
說(shuō)明:源操作數(shù)和目的操作數(shù)被當(dāng)作4個(gè)帶符號(hào)的十進(jìn)制(BCD)數(shù),十進(jìn)制源操作數(shù)和進(jìn)位C加至目的操作數(shù),源操作數(shù)不變,目的操作數(shù)以前的數(shù)據(jù)丟失。
狀態(tài)位:NMSB為1時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果大于9999(或大于99)時(shí)置位;
V不變。
DADD指令類似ADDC指令,只是操作數(shù)性質(zhì)不一樣,前者為BCD數(shù),后者為二進(jìn)制數(shù)。DADD指令進(jìn)行加法運(yùn)算時(shí),由于不需要進(jìn)行二進(jìn)制到BCD數(shù)的轉(zhuǎn)換,因此會(huì)節(jié)省時(shí)間和ROM空間。
例:R5和R6中的8位十進(jìn)制加至R3和R4中的8位十進(jìn)制數(shù)(R4和R3含有MSBs)。
CLRC ;清除進(jìn)位位
DADDR5,R3 ;加LSDs
DADDR6,R4 ;帶進(jìn)位位加MSDs
JCOVERFLOW ;若產(chǎn)生進(jìn)位,則轉(zhuǎn)移至錯(cuò)誤處理子程序
(5)*DADC:將十進(jìn)制的進(jìn)位加至目的操作數(shù)。
語(yǔ)法:DADCdst或DADC.Wsrc,dst/DADC.Bdst
操作:dst+C→dst
說(shuō)明:進(jìn)位位C和目的操作數(shù)相加,結(jié)果存到目的操作數(shù)。
仿真:DADD#0,dst;
狀態(tài)位:NMSB為1時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C目的操作數(shù)從9999增至0000時(shí)(或從99增至00)置位,否則復(fù)位;
V不變。
DADC指令類似ADC指令,只是操作數(shù)的性質(zhì)不一樣,前者為BCD數(shù),后者為二進(jìn)制數(shù)。
例:R5中的4位十進(jìn)制數(shù)加至R8指向8位十進(jìn)制數(shù)。
CLRC
DADDR5,0(R8);
DADC2(R8);
(6)*INC:目的操作數(shù)加1。
語(yǔ)法:INCdst或INC.Wdst/INC.Bdst
操作:dst+1→dst
說(shuō)明:完成目的操作數(shù)加1。
仿真:ADD#1,dst
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果包含0FFFFH(或包含0FFH)時(shí)置位,否則復(fù)位;
C結(jié)果包含0FFFFH(或包含0FFH)時(shí)置位,否則復(fù)位;
V結(jié)果包含07FFFH(或包含07FH)時(shí)置位,否則復(fù)位。
目的操作數(shù)可以采用寄存器尋址、絕對(duì)尋址和變址尋址三種方式:
INCRn;
INCX(Rn);
INC&EDE;
INCDirect;
此指令一般用在循環(huán)程序中修改地址指針和循環(huán)次數(shù)。
例:將R6指向的100個(gè)字傳送到R7所指向的100個(gè)連續(xù)字地址空間。
MOV#100,R8 ;傳送的字?jǐn)?shù)
TRANS MOV@R6+,0(R7) ;對(duì)應(yīng)單元開始傳送
INCR7;
INCR7;字操作,調(diào)整R7所指向的單元
DECR8;每傳送完一個(gè)字,傳送字?jǐn)?shù)減1
JNZTRANS;沒(méi)有傳送完,繼續(xù)
… ;傳送完畢
(7)*INCD:目的操作數(shù)增2。
語(yǔ)法:INCDdst或INCD.Wdst/INCD.Bdst
操作:dst+2→dst
說(shuō)明:目的操作數(shù)加2送回到目的操作數(shù)。
仿真:ADD#2,dst或ADD.B#2,dst
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果包含0FFFEH(包含0FEH)時(shí)置位,否則復(fù)位;
C結(jié)果包含0FFFEH或0FFFFH(包含0FEH或0FFH)時(shí)置位,否則復(fù)位;
V結(jié)果包含07FFEH或07FFFH(包含07EH或07FH)時(shí)置位,否則復(fù)位。
例如:
INCDSP;
INCD.B0(SP);
2.減法指令
表4-7MSP430的減法指令
(1)SUB:從目的操作數(shù)中減去源操作數(shù)。
語(yǔ)法:SUBsrc,dst或SUB.Wsrc,dst/SUB.Bsrc,dst
操作:dst+.NOT.src+1→dst或dst-src→dst
說(shuō)明:從目的操作數(shù)中減去源操作數(shù),結(jié)果存在目的操作數(shù)中,即將源操作數(shù)求反加上1,然后再加上目的操作數(shù),結(jié)果送目的操作數(shù),源操作數(shù)內(nèi)容不變。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果的MSB產(chǎn)生進(jìn)位時(shí)置位,否則復(fù)位,即無(wú)借位時(shí)置為1,有借位時(shí)
復(fù)位。借位被視為一種非進(jìn)位:
借位
進(jìn)位位
是
0
否
1
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位。
目的操作數(shù)可以是寄存器或者存儲(chǔ)單元,源操作數(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(無(wú)借位)。
SUB#5FE6H,direct;
執(zhí)行前:(direct)=220H,(220H)=0FFFFH;
執(zhí)行后:(direct)=220H,(220H)=0AD19H,(C)=1(無(wú)借位)。
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(無(wú)借位)。
(2)SUBC,SBB:帶借位的減法指令。
語(yǔ)法: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)
說(shuō)明:從目的操作數(shù)中減去源操作數(shù),具體方法是將源操作數(shù)求反再加上進(jìn)位C,源操作數(shù)不受影響,結(jié)果存入目的操作數(shù)。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果的MSB產(chǎn)生進(jìn)位時(shí)置位,否則復(fù)位,無(wú)借位時(shí)置1,有借位時(shí)為0;
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位。
該指令的目的操作數(shù)可以是寄存器或者存儲(chǔ)單元。源操作數(shù)可以用所有的7種尋址方式,該指令既適用于字操作,又適用于字節(jié)操作。該指令在減法操作中的功能類似于ADDC指令在加法操作時(shí)的功能,都是用于多字節(jié)(字)的運(yùn)算。進(jìn)行高位運(yùn)算時(shí)要考慮低位的進(jìn)位(加法)或者借位(減法)。
例如:
SUB.WR13,R10;
SUBC.BR12,R9;
SUB.B@R13+,R10;
SUBC.B@R12,R11;
(3)*SBC:從目的操作數(shù)中減去借位。
語(yǔ)法:SBCdst或SBC.Wdst/SBC.Bdst
操作:dst+0FFFFH+C→dst
dst+0FFH+C→dst
說(shuō)明:進(jìn)位C加到減1后的目的操作數(shù),結(jié)果存入目的操作數(shù)。
仿真:SUBC#0,dst或SUBC.B#0,dst
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
Cdst從0000H減至0FFFFH(或從00減至0FFH)時(shí)復(fù)位,其它情況下置位;
V初始C=0且dst=08000H(或dst=080H)時(shí)置位,其它情況下復(fù)位。
同理,借位可視為非進(jìn)位1。
例如:SUB@R13,0(R12);
SBC2(R12);
(4)
*DEC:目的操作數(shù)減1。
語(yǔ)法:DECdst或
DEC.Wdst/DEC.Bdst
操作:dst-1→dst
仿真:SUB#1,dst或SUB.B#1,dst
說(shuō)明:目的操作數(shù)減1,結(jié)果存入目的操作數(shù)。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z目的操作數(shù)初值為1時(shí)置位,否則復(fù)位;
C目的操作數(shù)初值為0時(shí)復(fù)位,否則置位;
V產(chǎn)生算術(shù)溢出時(shí)置位,否則復(fù)位,目的操作數(shù)的初始值為08000H(或080H)時(shí)置位,否則復(fù)位。
例4.1
將R6指向的100個(gè)字傳送到R7所指向的100個(gè)連續(xù)的字地址空間。
MOV#100,R8;傳送的字的個(gè)數(shù)(循環(huán)指針)送入R8
TRANSMOV@R6+,0(R7);對(duì)應(yīng)單元開始傳送
INCDR7 ;字操作,調(diào)整R7所指向的單元
DECR8 ;每傳送完畢一個(gè)字,傳送字的個(gè)數(shù)減1(修改循環(huán)指針)
JNZTRANS ;沒(méi)有傳送完,繼續(xù)
… ;傳送完畢
例4.2
將R10減1。
DECR10 ;R10減1;
;將從EDE開始的255字節(jié)存儲(chǔ)區(qū)塊移到從TONI開始的存儲(chǔ)區(qū)
;地址表不能重疊:目的地址TONI的起點(diǎn)不能位于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處的存儲(chǔ)器字節(jié)減1。
DEC.BLEO ;MEM(LEO)減1
;將從EDE開始的255字節(jié)存儲(chǔ)區(qū)塊移到從TONI開始的存儲(chǔ)區(qū),地址表不能
;重疊,目的地址TONI的起點(diǎn)不能位于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。
語(yǔ)法:DECDdst或DECD.Wdst/DECD.Bdst
操作:dst-2→dst
仿真:SUB#2,dst或SUB.B#2,dst
說(shuō)明:目的操作數(shù)減2,結(jié)果存入目的操作數(shù)。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Zdst包含2時(shí)置位,否則復(fù)位;
Cdst包含0或1時(shí)復(fù)位,否則置位;
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位;目的操作數(shù)的初始值為08000H或08001H時(shí)置位,否則復(fù)位;目的操作數(shù)的初始值為080H或081H時(shí)置位,否則復(fù)位。
例4.4R10減2。
DECDR10 ;R10減2
;將從EDE開始的255字節(jié)存儲(chǔ)區(qū)塊移到從TONI開始的存儲(chǔ)區(qū),地址表
;不能重疊,目的地址TONI的起點(diǎn)不能位于EDE~EDE+0FEH的范圍內(nèi)
MOV#EDE,R6
MOV#510,R10
LS2MOV.B@R6+,TONI-EDE-2(R6)
DECDR10
JNZLS2
例4.5
地址LEO處的存儲(chǔ)器減2。
DECD.BLEO ;MEM(LEO)減2
DECD.BSTATUS ;狀態(tài)字節(jié)STATUS減2。
(6)CMP:比較源操作數(shù)和目的操作數(shù)。
語(yǔ)法:CMPsrc,dst或CMP.Wsrc,dst/CMP.Bsrc,dst
操作:dst+.NOT.src+1或(dst-src)
說(shuō)明:從目的操作數(shù)中減去源操作數(shù),即將源操作數(shù)求反再加上1。源操作數(shù)和目的操作數(shù)內(nèi)容不變,不保存結(jié)果,只是影響狀態(tài)位。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位(src≥dst);
Z結(jié)果為0時(shí)置位,否則復(fù)位(src=dst);
C結(jié)果的MSB產(chǎn)生進(jìn)位時(shí)置位,否則復(fù)位;
V發(fā)生算術(shù)溢出時(shí)置位,否則復(fù)位。
比較指令通常用于比較兩個(gè)數(shù)之間的關(guān)系,即判斷兩者的大小或是否相等。在比較指令之后,零標(biāo)志可判別兩者是否相等,若兩者不等,則可利用比較指令之后的標(biāo)志位的狀態(tài)來(lái)確定兩者的大小。設(shè)A,B是參與比較的兩個(gè)數(shù),利用A-B進(jìn)行比較操作:
若兩者相等,則相減以后結(jié)果為0,Z=1,否則Z=0;
兩個(gè)無(wú)符號(hào)數(shù)相比較時(shí),用借位標(biāo)志C來(lái)確定兩者的大小。C=0則A>B;C=1則A<B。
兩個(gè)有符號(hào)數(shù)相比較時(shí),用溢出標(biāo)志和負(fù)標(biāo)志來(lái)確定兩者的大小,方法如下:
在沒(méi)有溢出的情況下,即V=0時(shí),若N=0,則A>B;若N=1,則A<B。
在發(fā)生溢出的情況下,即V=1時(shí),若N=1,則A>B;若N=0,則A<B。
例4.6
比較兩個(gè)RAM塊,如果不等,程序跳轉(zhuǎn)到標(biāo)號(hào)ERROR。
MOV#NUM,R5;被比較數(shù)據(jù)塊的長(zhǎng)度送入R5
L$1
CMP&BLOCK1,&BLOCK2 ;兩數(shù)據(jù)塊中的數(shù)據(jù)進(jìn)行比較
JNZERROR;不等,則跳轉(zhuǎn)到ERROR
DECR5 ;修改數(shù)據(jù)塊長(zhǎng)度指針
JNZL$1 ;判斷比較完否,否則進(jìn)行另一次比較
(1)AND:源操作數(shù)和目的操作數(shù)“與”。
語(yǔ)法:ANDsrc,dst或AND.Wsrc,dst/AND.Bsrc,dst
操作:src.AND.dst→dst
說(shuō)明:源操作數(shù)和目的操作數(shù)邏輯與,其結(jié)果放入目的操作數(shù)。
狀態(tài)位:N結(jié)果的MSB為1時(shí)置位,為0時(shí)復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果不為0時(shí)置位,其他情況時(shí)不受影響(=.NOT.Zero);
V復(fù)位。
邏輯操作指令是按位進(jìn)行的,所以“AND”指令常用來(lái)屏蔽字節(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ù)的各位。
語(yǔ)法:BICsrc,dst或BIC[.W]src,dst/BIC.Bsrc,dst
操作:.NOT.src.AND.dst→dst
說(shuō)明:求反后的源操作數(shù)和目的操作數(shù)作邏輯相與,其結(jié)果放入目的操作數(shù),源操作數(shù)將不受影響,只是在運(yùn)算的中間過(guò)程中利用其取反的值參與運(yùn)算。
狀態(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é)存儲(chǔ)區(qū)塊移到從TONI開始的存儲(chǔ)區(qū),地址表不能重疊。目的地址TONI的起點(diǎn)不能位于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ù)的各位。
語(yǔ)法:BISsrc,dst或BIS[.W]src,dst/BIS.Bsrc,dst
操作:src.OR.dst→dst
說(shuō)明:源操作數(shù)和目的操作數(shù)作邏輯或,結(jié)果放入目的操作數(shù),源操作數(shù)不受影響。
狀態(tài)位:N,Z,C,V均不受影響。
邏輯“或”運(yùn)算可用于對(duì)某一操作數(shù)中的若干位維持不變,而另外若干位置為1的場(chǎng)合。欲保留(不變)的位用“0”去“或”,而要置位的用“1”去“或”。利用“或”運(yùn)算,可以對(duì)兩個(gè)操作數(shù)進(jìn)行組合,也可以對(duì)某些位置位。
例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:測(cè)試目的操作數(shù)的各位。
語(yǔ)法:BITsrc,dst或BIT.Wsrc,dst/BIT.Bsrc,dst
操作:src.AND.dst
說(shuō)明:源操作數(shù)和目的操作數(shù)作邏輯與,其結(jié)果僅影響狀態(tài)位,源操作數(shù)和目的操作數(shù)不受影響。
狀態(tài)位:N結(jié)果的MSB為1時(shí)置位,為0時(shí)復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果不為0時(shí)置位,否則復(fù)位;
V復(fù)位。
這條指令通常是用于檢測(cè)一些條件是否滿足,但又不希望改變?cè)械牟僮鲾?shù)的情況。通常可以在這條指令之后安排一條條件轉(zhuǎn)移指令。
例4.14
如果R8中的位9被置位,程序轉(zhuǎn)移到標(biāo)號(hào)語(yǔ)句TOM處。
BIT#0200H,R8 ;R8的位9是否被置位
JNZTOM ;是,則轉(zhuǎn)移到標(biāo)號(hào)TOM處
…
;否,則繼續(xù)
(5)XOR:源操作數(shù)和目的操作數(shù)“異或”。
語(yǔ)法:XORsrc,dst或XOR.Wsrc,dst/XOR.Bsrc,dst
操作:src.XOR.dst→dst
說(shuō)明:源操作數(shù)和目的操作數(shù)“異或”,其結(jié)果放入目的操作數(shù),源操作數(shù)不受影響。
狀態(tài)位:N結(jié)果的MSB為1時(shí)置位,為0時(shí)復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C結(jié)果不為0時(shí)置位,否則復(fù)位;
V兩個(gè)操作數(shù)均為負(fù)時(shí)置位。
“異或”運(yùn)算常用于對(duì)某一操作數(shù)中的某些位取反,其它位不變。對(duì)欲保留不變的那些位是用“0”去“異或”,而對(duì)要取反的那些位用“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ù)求反。
語(yǔ)法:INVdst/INV.Bdst
操作:.NOT.dst→dst
說(shuō)明:目的操作數(shù)取反,以前的數(shù)據(jù)丟失。
仿真:XOR#0FFFFH,dst或XOR.B#0FFH,dst
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Zdst包含0FFFFH(或0FFH)時(shí)置位,否則復(fù)位;
C結(jié)果不為0時(shí)置位,否則復(fù)位;
V初始目的操作數(shù)為負(fù)時(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)左移。
語(yǔ)法:RLAdst或RLA.Wdst/RLA.Bdst
操作:C←MSB←MSB-1←…LSB+1←LSB←0
說(shuō)明:目的操作數(shù)左移一位,MSB成為進(jìn)位位C,LSB填0,RLA指令可將操作數(shù)左移一位,相當(dāng)于將該操作數(shù)乘2。在執(zhí)行該操作前,如果03FFFH<dst<0C000H(如果是字節(jié)操作,03FH<dst<0C0H),則產(chǎn)生溢出,結(jié)果會(huì)改變符號(hào)。
仿真:ADDdst,dst或ADD.Bdst,dst
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C從MSB獲??;
V如產(chǎn)生算術(shù)溢出,則03FFFH<dst<0C000H(或03FH<dst<0C0H)時(shí)置位,否則復(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)右移。
語(yǔ)法:RRAdst或RRA.Wdst/RRA.Bdst
操作:MSB→MSB,MSB→MSB-1,MSB-1→MSB-2,…,LSB+1→LSB,LSB→C
說(shuō)明:目的操作數(shù)右移一位,但保持符號(hào)不變,最低位移至進(jìn)位位C,MSB移入MSB,MSB移入MSB-1,MSB-1移入MSB-2,LSB+1移入LSB。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則為復(fù)位;
Z結(jié)果為0時(shí)置位,否則為復(fù)位;
C從LSB獲?。?/p>
V復(fù)位。
例4.19
RRAR7
執(zhí)行前:(R7)=8122H,C=0;執(zhí)行后:(R7)=0C091H,C=0,N=1。
(4)RRC:帶進(jìn)位位循環(huán)右移。
語(yǔ)法:RRCdst或RRC.W/dstRRC.Bdst
操作:C→MSB→MSB-1→…→LSB+1→LSB→C
說(shuō)明:目的操作數(shù)內(nèi)容循環(huán)右移,進(jìn)位位C移入MSB,目的操作數(shù)各位均右移一位,LSB移入進(jìn)位位C。
狀態(tài)位:N結(jié)果為負(fù)時(shí)置位,否則復(fù)位;
Z結(jié)果為0時(shí)置位,否則復(fù)位;
C從LSB獲??;
V初始目的操作數(shù)為正且初始進(jìn)位位被置位時(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)的位操作指令能夠完成對(duì)負(fù)標(biāo)志、進(jìn)位標(biāo)志、零標(biāo)志和中斷標(biāo)志位進(jìn)行清零和置位操作。
(1)*CLRC:清除進(jìn)位位。
語(yǔ)法:CLRC
操作:0→C
說(shuō)明:使進(jìn)位位C清零。
仿真:BIC#1,SR
狀態(tài)位:N,Z,V不受影響,C=0。
(2)*CLRN:清除負(fù)位。
語(yǔ)法:CLRN
操作:0→N或.NOT.src.AND.dst→dst
說(shuō)明:使負(fù)標(biāo)志位N清零。
仿真:BIC#4,SR
狀態(tài)位:Z,C,V不受影響,N=0。
(3)*CLRZ:清除零位。
語(yǔ)法:CLRZ
操作:0→Z或.NOT.src.AND.dst→dst
說(shuō)明:使零標(biāo)志位Z清零。
仿真:BIC#2,SR
狀態(tài)位:N,C,V不受影響,Z=0。
(4)*SETC:置位進(jìn)位位。
語(yǔ)法:SETC
操作:1→C
說(shuō)明:使進(jìn)位位C置位(常用操作)。
仿真:BIS#1,SR
狀態(tài)位:N,Z,V不受影響,C=1。
(5)*SETN:置位負(fù)標(biāo)志位。
語(yǔ)法:SETN
操作:1→N
說(shuō)明:使負(fù)標(biāo)志位N置位。
仿真:BIS#4,SR
狀態(tài)位:Z,C,V不受影響,N=1。
(6)*SETZ:置位零標(biāo)志位。
語(yǔ)法:SETZ
操作:1→Z
仿真:BIS#2,SR
說(shuō)明:使零標(biāo)志位Z置位。
狀態(tài)位:N,C,V不受影響,Z=1。
(7)*DINT:禁止可屏蔽中斷。
語(yǔ)法:DINT
操作:0→GIE或(0FFF7H.AND.SR→SR/.NOT.src.AND.dst→dst)
說(shuō)明:使控制標(biāo)志GIE清零,禁止所有中斷。
仿真:BIC#8,SR
狀態(tài)位:N,Z,C,V不受影響。
(8)*EINT:使能可屏蔽中斷。
語(yǔ)法:EINT
操作:1→GIE或(0008H.OR.SR/.NOT.src.OR.dst→dst)
說(shuō)明:使控制標(biāo)志位GIE置位,使能所有中斷。
仿真:BIS#8,SR
狀態(tài)位:N,Z,C,V均不受影響。
注意:任何情況下都可以執(zhí)行使能中斷指令EINT后面的指令,甚至在中斷服務(wù)請(qǐng)求懸而未決時(shí)也可以執(zhí)行。
例4.20
狀態(tài)寄存器中的一般中斷使能位GIE清零,可允許非中斷移動(dòng)一個(gè)32位數(shù)值,這樣可以保證在任何中斷移動(dòng)期間,該數(shù)值不會(huì)被修改。
DINT ;所有使用GIE位的中斷事件被禁止
MOVCOUNTHI,R5 ;復(fù)制數(shù)值
MOVCOUNTLO,R6
EINT ;所有使用GIE位的中斷事件被使能
4.3.5跳轉(zhuǎn)與程序流程的控制類指令
MSP430指令系統(tǒng)可執(zhí)行跳轉(zhuǎn)與程序流程控制的指令,采用和其它指令相同的尋址方式,非常適合于計(jì)算地址以實(shí)現(xiàn)分支跳轉(zhuǎn)和子程序調(diào)用。
(1)
*BR,BRANCH:轉(zhuǎn)移至目的操作數(shù)。
語(yǔ)法:BRdst
操作:dst→PC
說(shuō)明:無(wú)條件轉(zhuǎn)移到64KB地址空間的任一地址處,可使用所有的源尋址方式。轉(zhuǎn)移指令是一個(gè)字指令。
仿真:MOVdst,PC
狀態(tài)位:不影響狀態(tài)位。
例4.21
給出所有尋址方式的示例
BR#EXEC ;轉(zhuǎn)移到標(biāo)號(hào)EXEC或直接轉(zhuǎn)移(例:#0A4H)
BREXEC ;轉(zhuǎn)移到EXEC所包含的地址處執(zhí)行
BR&EXEC ;轉(zhuǎn)移到絕對(duì)地址EXEC中包含的地址
BRR5 ;轉(zhuǎn)移到R5中包含的地址處開始執(zhí)行
BR@R5 ;轉(zhuǎn)移到R5指向的字中包含的地址
BR@R5+ ;轉(zhuǎn)移到R5指向的字中包含的地址,然后R5中的指針增1下一次S/W流使用R5指針——它可通過(guò)訪問(wèn)R5指向的地址表中的下一個(gè)地址改變程序的執(zhí)行
BRX(R5) ;轉(zhuǎn)移到R5+X指向的地址中包含的地址(例:從X開始的地址表),X可以是一個(gè)地址也可以是一個(gè)標(biāo)號(hào)
(2)
CALL:子程序調(diào)用指令。
語(yǔ)法:CALLdst
操作:dst→tmp;dst被評(píng)估和存儲(chǔ)
SP-2→SP
PC→@SP ;將PC更新至TOS
tmp→PC ;將dst保存至PC
說(shuō)明:調(diào)用64KB地址空間中任意一地址處的子程序,可使用所有的尋址方式。返回地址(后續(xù)指令的地址)存儲(chǔ)在堆棧中,調(diào)用指令是一個(gè)字指令。
狀態(tài)位:不影響狀態(tài)位。
例4.22KCALL指令程序舉例。
CALL#EXEC ;調(diào)用標(biāo)號(hà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)用絕對(duì)地址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中的指針自動(dòng)增2
;SP-2→SP,PC+2→@SP,@R5→PC
CALLX(R5) ;調(diào)用R5+X指向的地址中包含的地址(例如從X開始的地址表),X可以是一個(gè)地址也可以是一個(gè)標(biāo)號(hào)。
;SP-2→SP,PC+2→@SP,X(R5)→PC
(3)
JC,JHS指令。
JC進(jìn)位位置位時(shí)程序跳轉(zhuǎn)。
JHS大于或等于時(shí)程序跳轉(zhuǎn)。
語(yǔ)法:JC標(biāo)號(hào)
JHS標(biāo)號(hào)
操作:若C=1,PC+2×偏移→PC;
若C=0,順序執(zhí)行下一條指令。
說(shuō)明:該指令用于測(cè)試狀態(tài)寄存器的進(jìn)位位。如果C被置位,則指令的LSB中包含的10位符號(hào)偏移加至程序計(jì)數(shù)器;如果C被復(fù)位,則執(zhí)行該指令后面緊隨其后的一條指令。JC用于比較無(wú)符號(hào)數(shù)(0~65535)(有進(jìn)位/大于等于時(shí)跳轉(zhuǎn))。
狀態(tài)位:N,Z,C,V均不受影響。
(4)JEQ,JZ指令。
JEQ等于時(shí)程序跳轉(zhuǎn)。
JZ為零時(shí)程序跳轉(zhuǎn)。
語(yǔ)法:JEQ標(biāo)號(hào)
JZ標(biāo)號(hào)
操作:若Z=1,則PC+2×偏移→PC;
若Z=0,則執(zhí)行下一條指令。
說(shuō)明:測(cè)試狀態(tài)寄存器的零位Z。如果Z被置位,則指令的LSB中包含的10位符號(hào)偏移加至程序計(jì)數(shù)器;如果Z被復(fù)位,則順序執(zhí)行緊隨其后的下一條指令。
狀態(tài)位:N,Z,C,V均不受影響。
例4.25
若R5中的內(nèi)容為0,則程序轉(zhuǎn)移到地址TONI。
TSTR5 ;測(cè)試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:大于或等于時(shí)程序跳轉(zhuǎn)。
語(yǔ)法:JGE標(biāo)號(hào)
操作:若(N.XOR.V)=0,程序跳轉(zhuǎn)至標(biāo)號(hào):PC+2×偏移→PC;
若(N.XOR.V)=1,順序執(zhí)行下一條指令。
說(shuō)明:測(cè)試狀態(tài)寄存器的負(fù)位N和溢出位V。如果N和V均被置位或復(fù)位,則指令的LSB中包含的10位符號(hào)偏移加至程序計(jì)數(shù)器;如果N和V其中之一被復(fù)位,則順序執(zhí)行緊隨其后的下一條指令。該指令允許比較符號(hào)整數(shù)。
狀
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)售后售后服務(wù)
- 社區(qū)黨員先鋒行動(dòng)計(jì)劃保證書
- 企業(yè)間借款合同范本格式設(shè)計(jì)
- 專業(yè)代理記賬服務(wù)合同
- 學(xué)業(yè)成績(jī)承諾函保證承諾
- 致愛人的道歉信請(qǐng)求女友原諒
- 點(diǎn)工協(xié)議書格式
- 專業(yè)企業(yè)保證書范文
- 數(shù)據(jù)備份與恢復(fù)合同
- 爆破作業(yè)合同范本模板
- 大眾頂級(jí) 輝騰 減振控制的空氣懸架_圖文
- 血液透析??撇僮髁鞒碳霸u(píng)分標(biāo)準(zhǔn)
- 電工新技術(shù)介紹(課堂PPT)
- 座板式單人吊具(課堂PPT)
- 托班一日生活情況反饋表
- 機(jī)電設(shè)備維護(hù)保養(yǎng)技術(shù)
- FLAC3D常用命令
- JGJ_T231-2021建筑施工承插型盤扣式鋼管腳手架安全技術(shù)標(biāo)準(zhǔn)(高清-最新版)
- 畢業(yè)論文(設(shè)計(jì))除雪車工作裝置設(shè)計(jì)
- 鏡片加工知識(shí)之四研磨
- 核電站1E級(jí)電氣設(shè)備鑒定標(biāo)準(zhǔn)技術(shù)經(jīng)驗(yàn)
評(píng)論
0/150
提交評(píng)論