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

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論