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

下載本文檔

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

文檔簡介

《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》合肥工業(yè)大學(xué)吳曄,張陽,滕勤第3章S12X指令系統(tǒng)本章內(nèi)容3.1概述3.2S12X匯編指令的格式和符號說明3.3尋址方式(AddressingMode)3.4S12X匯編指令系統(tǒng)《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.1概述【基本概念回顧】【指令】計算機(jī)能直接識別和執(zhí)行的命令,即每個有效的編碼組?!局噶钕到y(tǒng)】一種計算機(jī)CPU所能執(zhí)行的全部指令的集合。【指令助記符】(instructionmnemonicsymbol)用一組有一定含義的字符表示的指令,一般采用相關(guān)的英文單詞縮寫?!緟R編語言源程序】利用指令助記符編寫的程序?!静僮鞔a】(Opcode)規(guī)定一條指令完成何種操作?!静僮鲾?shù)】(Operand)指令所完成操作的對象?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)本節(jié)內(nèi)容3.2S12X匯編指令的格式和符號說明3.2.1操作碼和操作數(shù)3.2.2數(shù)據(jù)類型3.2.3數(shù)據(jù)表示方法3.2.4寄存器和存儲器表示法《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.2S12X匯編指令的格式和符號說明

[標(biāo)號]操作碼[操作數(shù)1],[操作數(shù)2][;注釋]3.2.1操作碼和操作數(shù)CPU12指令組成:(前導(dǎo)字節(jié))+操作碼(+后隨字節(jié)+擴(kuò)展字節(jié))后置字節(jié)提供了一定形式的變址尋址、傳送、交換和循環(huán)的基址寄存器和偏移量的符號等信息。擴(kuò)展字節(jié)包含有附加的程序信息,例如地址、偏移量和立即數(shù)等。位于第二頁的操作碼之前均冠以前導(dǎo)字節(jié)(prebyte)$18。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.2CPU12匯編指令的格式和符號說明3.2.2數(shù)據(jù)類型CPU12X支持8種數(shù)據(jù)類型:位數(shù)據(jù)(1位);5位帶符號整數(shù);8位帶/無符號整數(shù);字節(jié)型組合BCD數(shù)(8位);9位帶符號整數(shù);16位帶/無符號整數(shù);16位有效地址;32位帶/無符號整數(shù)。3.2.3數(shù)據(jù)表示方法十進(jìn)制整數(shù)可直接使用;16進(jìn)制數(shù)在數(shù)字前面加“$”;二進(jìn)制數(shù)前加“%”;立即數(shù)應(yīng)在數(shù)據(jù)前加“#”。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.2CPU12匯編指令的格式和符號說明3.2.4寄存器和存儲器表示法寄存器用名稱表示,不分大小寫;M(Memorylocation)表示由指令有效地址指向的8位存儲單元;R(Result)表示算術(shù)或邏輯運(yùn)算結(jié)果;I(Intermediateresult)表示算術(shù)或邏輯運(yùn)算的中間結(jié)果。寄存器和存儲器符號加下標(biāo)“n”時,表示是它的第n位;16位寄存器符號后加下標(biāo)“H”或“L”時,表示其高位字節(jié)或低位字節(jié)。M:M+1表示16位存儲器,由M和M+1相鄰兩個存儲單元組成。M~M+3表示32位存儲器,由4個相鄰的存儲單元M、M+1、M+2、M+3組成;(M:M+1)表示兩個相鄰存儲單元的內(nèi)容組成的1個字,(M)為高位字節(jié),(M+1)為低位字節(jié);符號()表示內(nèi)容,如M(X)、M(SP)分別是由變址寄存器X和堆棧指針SP所指向的存儲單元,M(y+3)是由變址寄存器Y加3后指向的存儲單元?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)本節(jié)內(nèi)容3.3尋址方式3.3.1隱含/固有尋址(InherentAddressing,INH)3.3.2立即尋址(ImmediateAddressing,IMM)3.3.3直接尋址(DirectAddressing,DIR)3.3.4擴(kuò)展尋址(ExtendedAddressing,EXT)3.3.5相對尋址(RelativeAddressing,REL)3.3.6變址尋址(IndexedAddressing,IDX)3.3.7全局尋址《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式尋址:尋找操作數(shù)地址的過程。有效地址(effectiveaddress):操作數(shù)所在的地址。尋址方式(AddressingMode):通過確定操作數(shù)所在的位置(地址),提取操作數(shù)的方法。CPU12共有6類尋址方式,即固有尋址、立即尋址、直接尋址、擴(kuò)展尋址、相對尋址和變址尋址?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.1隱含/固有尋址(InherentAddressing,INH)【固有尋址】有效地址包含在操作碼中,也稱為隱含尋址(Impliedaddressing),又因為操作數(shù)總是處于CPU的寄存器之中,還稱為寄存器尋址(Registeraddressing)?!咎卣鳌恐噶钪浄谐霈F(xiàn)寄存器的名稱,有時甚至連寄存器的名稱都不出現(xiàn)。

操作碼指令操作187CLRA$00→A267CLRB$00→B351COMB(/B)→B412MUL(A)(B)=A:B→D51816SBA(A)-(B)→A6180ETAB(A)→(B)《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.2立即尋址(ImmediateAddressing,IMM)【立即尋址】指令的操作數(shù)是一個8位或16位二進(jìn)制數(shù)。指令中出現(xiàn)的操作數(shù)稱為立即數(shù),為了與直接地址相區(qū)別,立即數(shù)前必須加“#”號。立即尋址常用來給寄存器賦值。

INITSPequ$02FFMAXCNTequ13機(jī)器碼指令操作18600LDAA #MAXCNT ;$0D→A2CF1234LDS #INITSP ;$02FF→SP3CE1234LDX #$1234 ;$1234→X4CD0067LDY #$67 ;$0067→Y58A0BORAA #%00001011 ;(A)|$0B→A《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.3直接尋址(DirectAddressing,DIR)【直接尋址】指令中直接給出操作數(shù)地址的尋址方式。

機(jī)器碼指令操作9655LDAA$55;($0055)→ADC20LDX$20;($0020:$0021)→X3.3.4擴(kuò)展尋址(ExtendedAddressing,EXT)【擴(kuò)展尋址】指令中直接給出操作數(shù)完整16位地址的尋址方式。

STAA $3050 ;(A)→$3050機(jī)器碼指令操作:($0040)→A8640LDAA$40 ;直接尋址B60040LDAA$0040 ;使用擴(kuò)展尋址B60040LDAA>$0040;強(qiáng)制使用擴(kuò)展尋址B60040LDAA>$40 ;強(qiáng)制使用擴(kuò)展尋址8640LDAA<$0040;強(qiáng)制使用直接尋址《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.5相對尋址(RelativeAddressing,REL)相對尋址只出現(xiàn)在相對轉(zhuǎn)移指令(relativebranchinstruction)中。【相對尋址】當(dāng)前的PC值加上指令中規(guī)定的地址偏移量relx,構(gòu)成操作數(shù)的實際地址的尋址方式。目的地址=源地址+轉(zhuǎn)移指令字節(jié)數(shù)+relx偏移量為8位、9位和16位帶符號二進(jìn)制補(bǔ)碼。短轉(zhuǎn)移的偏移量為$80~$7F(-128~+127);循環(huán)控制指令支持9位偏移量,其數(shù)值為$100~$0FF(-256~+255);長轉(zhuǎn)移的偏移量為$8000~$7FFF(-32768~32767)?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.5相對尋址(RelativeAddressing,REL)如果偏移量為0,則CPU立即執(zhí)行緊接著轉(zhuǎn)移指令的下一條指令。由于偏移量是在轉(zhuǎn)移指令的末尾,采用負(fù)的偏移量值可以使PC指向操作碼并開始循環(huán)。

20FETRAPBRATRAP;PC-2→PC程序利用轉(zhuǎn)移指令返回到指令首址,程序在該行落入陷阱,稱為“原地踏步”。這是一種終止程序的普通方法,廣泛用于程序調(diào)試?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.6變址尋址(IndexedAddressing,IDX)變址尋址是CPU12X的主要尋址方式,也是本節(jié)的重點和難點。【變址尋址】:以某個寄存器的內(nèi)容為基本地址,然后在這個基本地址上加上地址偏移量,形成操作數(shù)地址或存放操作數(shù)地址的地址,并將這個地址單元的內(nèi)容作為指令的操作數(shù)。CPU12共有4類不同的變址尋址方式,這4類又可進(jìn)一步分解成12種不同的變址尋址方式。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.6變址尋址(IndexedAddressing,IDX)變址尋址指令由一個操作碼字節(jié)、一個后置(隨)字節(jié)(postbyte)和0~2個擴(kuò)展字節(jié)(extensionbyte)組成。操作碼表明了指令功能和變址尋址方式,后置字節(jié)(在指令代碼表中用xb描述)提供了變址尋址方式的具體信息,如所使用的變址寄存器、偏移量的符號、變址寄存器的自動遞增/遞減方式等。當(dāng)偏移量大于5位二進(jìn)制數(shù)時,需要采用擴(kuò)展字節(jié),用來表示偏移量的大小。所有變址尋址方式都采用一個16位寄存器和附加信息來產(chǎn)生一個有效地址?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.1常數(shù)偏移變址尋址(ConstantOffsetIndexedAddressing)【常數(shù)偏移變址尋址】將變址寄存器的內(nèi)容加上一個常數(shù)形成操作數(shù)地址。有三種不同的偏移量:5位、9位和16位。語法:

operation,r;無偏移operation0,r;無偏移operationn,r;正常數(shù)偏移量operation-n,r;負(fù)常數(shù)偏移量

r是變址寄存器(IX,IY,SP,PC),n/-n是帶符號偏移量(5位、9位、16位)?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.1常數(shù)偏移變址尋址(ConstantOffsetIndexedAddressing)A、5位常數(shù)偏移變址尋址IDX(5-BitConstantOffsetIndexedAddressing)偏移量為5位帶符號數(shù),偏移量大小為:-16~+15,5位偏移量隱含在后隨字節(jié)中,有效地址為變址寄存器內(nèi)容+5位地址偏移量。指令為兩個字節(jié):操作碼和后置字節(jié)例如:若X=$1000,Y=$2000LDAA0,X;($1000)→ASTAB-8,Y;(B)→$1FF8,$2000-$8=$1FF8《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.1常數(shù)偏移變址尋址(ConstantOffsetIndexedAddressing)B、9位常數(shù)偏移變址尋址IDX1(9-BitConstantOffsetIndexedAddressing)9位帶符號偏移量的地址偏移范圍:-256~+255,偏移量的符號位在后隨字節(jié)中,偏移量大小在擴(kuò)展字節(jié)中,變址寄存器內(nèi)容加上9位帶符號常數(shù)偏移量作為操作數(shù)地址。例如:X=$1000,Y=$2000LDAA$FF,X;($10FF)→A($1000+$FF=$10FF)

LDAB-20,Y;($1FEC)→B($2000-$14=$1FFC)《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.1常數(shù)偏移變址尋址(ConstantOffsetIndexedAddressing)C、16位常數(shù)偏移變址尋址IDX2(16-BitConstantOffsetIndexedAddressing)4字節(jié)指令,包括一個字節(jié)操作碼、一個后置字節(jié)和兩個擴(kuò)展字節(jié)。有效地址由變址寄存器內(nèi)容加上兩個偏移量擴(kuò)展字節(jié)形成,可以訪問64KB地址空間中的任何單元。

LDAA$04,X ;($04+X)→ALDD$10,Y ;($10+Y):($10+Y+1)→DLDAA$1000,PC ;($1000+PC)→A《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.2自動遞增/遞減變址尋址IDX(Autoincrement/AutodecrementIndexedAddressing)在CPU12的變址尋址方式中,提供了4種方法自動改變基址寄存器的內(nèi)容,并作為指令執(zhí)行的一部分。變址尋址前或變址尋址后,變址寄存器中的數(shù)值可以加上或減去一個整數(shù)值,增加值的范圍是0000~0111(+1~+8),減少值范圍是1111~1000(-1~-8)。匯編指令語法:operationn,+r;先遞增operationn,r+;后遞增operationn,-r;先遞減operationn,r-;后遞減n=調(diào)節(jié)值,1≤n≤8,r=變址寄存器(IX,IY,SP)?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.2自動遞增/遞減變址尋址IDX(Autoincrement/AutodecrementIndexedAddressing)對于先遞增或先遞減的指令,變址寄存器內(nèi)容在訪問內(nèi)存單元之前變化,相當(dāng)于上述的常數(shù)偏移變址尋址。而對于后遞增或后遞減指令,則是用變址寄存器中的初值訪問內(nèi)存單元,然后才改變變址寄存器中的內(nèi)容。自動遞增和自動遞減變址尋址方式的指令由一個字節(jié)操作碼(有的指令在操作碼前有一個前導(dǎo)字符$18)和一個后置字節(jié)組成?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.2自動遞增/遞減變址尋址IDX(Autoincrement/AutodecrementIndexedAddressing)

STAA1,-SP;(SP)-1→SP,(A)→(SP),等效于PSHASTX2,-SP;(SP)-2→SP,(XH:XL)→MSP:MSP+1,等效于PSHXLDX2,SP;(MSP:MSP+1)→XH:XL,(SP)+2→SP,等效于PULXLDAA1,SP+;(MSP)→A,(SP)+1→SP,等效于PULA自動遞增/自動遞減變址尋址方式也可以用來對存儲器中的一系列數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作。例如:將X寄存器指向的寬度為4字節(jié)的列表中數(shù)據(jù)傳給Y寄存器指向的寬度為2字節(jié)的列表中。

MOVW4,X+,2,Y+;(X:X+1)→Y:Y+1,X+4→X,Y+2→Y從表元素為1個字的列表中傳送1個字的數(shù)據(jù)到每個表元素為4個字節(jié)的另一個表格中:MOVW2,X+,4,+Y《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.3累加器偏移變址尋址IDX(AccumulatorOffsetIndexedAddressing)【累加器偏移變址尋址】將變址寄存器中的內(nèi)容與累加器中的無符號偏移量相加,構(gòu)成有效地址。為了使用這種尋址方式,偏移量必須先置于累加器中,累加器可以是A、B、D。語法:operationA,r;偏移量在A中operationB,r;偏移量在B中operationD,r;偏移量在D中A、B、D-累加器(偏移寄存器);r-變址寄存器(X、Y、SP、PC)?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.3累加器偏移變址尋址IDX(AccumulatorOffsetIndexedAddressing)累加器偏移變址尋址指令由操作碼加上一個后置字節(jié)組成。例:LDAAB,X例:LDY#SEG_TBL ;SEG_TBL→YLDAADisp_Var ;(Disp_Var)→A

LDAAA,Y;(A+Y)→ASTAADISP_REG;A→DISP_REG《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.4間接變址尋址(IndirectIndexedAddressing)【寄存器間接尋址】操作數(shù)地址是以寄存器名稱的形式間接給出?!鹃g接變址尋址】變址寄存器中的內(nèi)容與一個16位偏移量相加形成一個地址,但該地址并不是操作數(shù)的地址,它所指向的地址單元中的內(nèi)容才是操作數(shù)的有效地址。偏移量既可以是一個16位的常數(shù)偏移量,也可以是累加器中的內(nèi)容。指令語法:operation[D,r];偏移量在累加器D中operation[n,r];n是16位常數(shù)偏移量D-含有偏移量的寄存器D;n-16位常數(shù)偏移量;r-變址寄存器(X、Y、SP、PC)?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.4間接變址尋址(IndirectIndexedAddressing)間接變址尋址方式的指令操作碼之后需要一個后置字節(jié),用來規(guī)定偏移量的來源和變址寄存器的名稱。對于常數(shù)偏移量的方式,后置字節(jié)之后還需要跟兩個擴(kuò)展字節(jié),用于存放16位偏移量常數(shù)。后置字節(jié)編碼為:《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.4間接變址尋址(IndirectIndexedAddressing)A、16位常數(shù)偏移間接變址尋址[IDX2](16-BitConstantIndirectIndexedAddressing)將由指令提供的16位偏移量與基址變址寄存器(baseindexingregister)的內(nèi)容相加,形成一個地址(指針),指向一個存放操作數(shù)地址的單元。指令執(zhí)行時,根據(jù)由基址和偏移量所形成的地址指針,首先到指定的地址單元中取得操作數(shù)地址,然后再根據(jù)操作數(shù)地址提取操作數(shù)。有效地址為:

effectiveaddress=((twooffsetextensionbytes)+(X、Y、SPorPC))為了將這種尋址方式與16位常數(shù)偏移變址尋址方式加以區(qū)別,在指令助記符的操作數(shù)部分,用一個方括號括起來?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6變址尋址(IndexedAddressing,IDX)3.3.6.4間接變址尋址(IndirectIndexedAddressing)A、16位常數(shù)偏移間接變址尋址[IDX2](16-BitConstantIndirectIndexedAddressing)例:設(shè)指令執(zhí)行前X=$1000,($100A)=$20,($100B)=$00,($2000)=$3A,($2001)=$1F。比較以下兩條指令的執(zhí)行情況:LDAA$0A,X;((X)+$0A)→ALDAA[$0A,X];(((X)+$0A))→A《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3.6.4間接變址尋址(IndirectIndexedAddressing)A、16位常數(shù)偏移間接變址尋址[IDX2](16-BitConstantIndirectIndexedAddressing)例:讀取一個轉(zhuǎn)移表中的地址,并根據(jù)該地址轉(zhuǎn)向相應(yīng)的子程序。

JMPTBLEQU$1000CMD10FFEQU2操作碼指令操作CE1000LDX#JMPTBL;JMPTBL→X15E30002JSR[CMD10FF,X];((CMD10FF+X))→PC15E7JSR[D,X];((D+X))→PC《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)B、累加器D間接變址尋址[D,IDX)(AccumulatorDIndexed-IndirectAddressing)將累加器D中的內(nèi)容+基址寄存器的內(nèi)容,形成一個地址指針,指向存放操作數(shù)地址的存儲單元。指令執(zhí)行時,根據(jù)基址寄存器和偏移寄存器D中的內(nèi)容形成一個地址,到該地址單元中找到操作數(shù)地址,再由操作數(shù)地址取得操作數(shù)。其有效地址為:

effectiveaddress=((D)+(X,Y,SPorPC))為了把這種尋址方式與累加器D偏移變址尋址方式區(qū)別開來,用一個方括號將指令助記符的操作數(shù)部分括起來。例:設(shè)D=$0002JMP[D,PC]GO1DC.WPLACE1GO2DC.WPLACE2GO3DC.WPLACE3《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.3尋址方式3.3.7全局尋址S12X內(nèi)核的地址線為16位,物理尋址空間限于64KB。但是,通過使用全局頁面尋址寄存器GPAGE(GlobalPageIndexRegister)中的7位并結(jié)合16位地址總線,S12X內(nèi)核可以實現(xiàn)22位地址總線尋址,尋址空間為8MB。全局尋址指令以G開頭,例如GLDAA、GSTAA等。GLDAA:(G(M)→A)把全局存儲器內(nèi)的值加載到累加器A。GLDAA和LDAA有相同的尋址模式,它們之間的區(qū)別只是用全局內(nèi)存地址(8MB)代替了內(nèi)存地址(64KB)。全局尋址并不是一種獨(dú)立的尋址方式,但由于其特殊性,因此簡要提及。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)本節(jié)內(nèi)容3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令3.4.2算術(shù)運(yùn)算指令3.4.3邏輯運(yùn)算指令3.4.4高級函數(shù)指令3.4.5程序控制指令3.4.6S12X控制指令《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)S12X匯編指令系統(tǒng)匯總表見附錄A,匯編指令系統(tǒng)表按字母順序排列,供編寫匯編程序時查閱,指令系統(tǒng)表從左到右分別按照指令助記符(指令形式)、指令操作說明(助記符含義)、尋址方式、機(jī)器碼、指令周期/訪問細(xì)節(jié)和程序狀態(tài)字節(jié)等信息;指令系統(tǒng)匯總解釋說明見附錄B。S12X匯編指令機(jī)器碼匯總表見附錄C;機(jī)器碼組織解釋說明見附錄D。如果按指令助記符分類,S12X共有279種不同的匯編指令??紤]到不同類型的尋址方式,指令數(shù)量達(dá)1024種。按照指令功能,可將指令分為以下幾大類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算指令、轉(zhuǎn)移與子程序調(diào)用指令、中斷指令、MCU控制指令、高級函數(shù)指令等?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令將數(shù)據(jù)從一處復(fù)制到另一處,包括:立即加載、寄存器之間的傳送與交換、內(nèi)存?zhèn)魉偷郊拇嫫?、寄存器傳送到?nèi)存、內(nèi)存之間的傳送、堆棧操作指令?!炯拇嫫骷虞d指令】寄存器加載指令用于將立即數(shù)或內(nèi)存中的操作數(shù)傳送給寄存器,共12條指令。前6條指令與CPU12的指令相同,每條指令支持8種源操作數(shù)尋址方式。后6條全局尋址指令是CPU12X的新增指令,支持7種源操作數(shù)尋址方式。共派生出90條指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器加載指令】《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器加載指令】LDAA #$5A ;$5A→A,立即尋址IMMLDAB $4000 ;($4000)→B,擴(kuò)展尋址EXTLDD 4,X ;((X)+4):((X)+4+1)→A:B,5位常數(shù)偏移量變址尋址IDXLDX A,PC ;((PC)+(A)):((PC)+(A)+1)→XH:XL,累加器偏移變址尋址IDXLDS [$1238,X] ;(($1238)+(X)):(($1238)+(X)+1)→SPH:SPL,;16位常數(shù)偏移量間接變址尋址[IDX2]LDY 2,SP+ ;(SP):(SP+1)→YH:YL,SP+2→SP,=PULY,自動遞增變址尋址GLDAA$4000 ;($4000)→A,擴(kuò)展尋址EXTGLDAB[D,X] ;((D)+(X)):((D)+(X)+1)→B,累加器間接變址尋址[D,IDX]GLDD $10 ;($10)→D,直接尋址DIR《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【有效地址加載指令】有效地址加載指令可以用來將操作數(shù)地址分別傳送到寄存器SP、X和Y中。共3條指令,采用3種變址尋址。指令可將SP、PC、X或Y的值加/減5位、9位或16位常數(shù),或者加上A、B或D的內(nèi)容,傳送到寄存器SP、X和Y中。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【有效地址加載指令】LEAS 4,SP ;(SP)+4→SP,5位常數(shù)偏移量變址尋址IDXLEAS 5,X ;(X)+5→SP,5位常數(shù)偏移量變址尋址IDXLEAS $0200,SP ;(SP)+$0200→SP,16位常數(shù)偏移量變址尋址IDX2,;相當(dāng)于SP的加法運(yùn)算,S12X沒有針對SP的加法指令。LEAX B,Y ;(Y)+(B)→X,累加器偏移變址尋址IDXLEAX $1000,Y ;(Y)+$1000→X,16位常數(shù)偏移量變址尋址IDX2LEAY D,Y ;(Y)+(D)→Y,累加器偏移變址尋址IDXLEAY D,SP ;(SP)+(D)→Y,累加器偏移變址尋址IDX該組指令既可以將一個寄存器的值按要求調(diào)整后送到另一個寄存器,也可以用來調(diào)整一個寄存器自身的值。注意以下兩條指令LEAX 4,+X ;X+4→X,(X)→X,自動遞增變址尋址IDXLEAX 4,X+ ;(X)→X,由于指令中兩種隱含的操作針對同一個寄存器,;且加載的是操作時的有效地址,因此X+4被忽略。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器存儲指令】寄存器存儲指令僅限于將寄存器內(nèi)容送入內(nèi)存單元,共12條指令,后6條全局尋址指令是CPU12X的新增指令。每條指令支持7種源操作數(shù)尋址方式,派生出84條指令。

《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器存儲指令】例如:STAA $5A ;直接尋址DIRSTAB $4000,X ;16位偏移量變址尋址IDX2STD -$1000,PC ;16位偏移量變址尋址IDX2STX $D000 ;擴(kuò)展尋址EXTSTS [D,PC] ;累加器D間接變址尋址[D,IDX]STY 2,-SP ;相當(dāng)于PSHY,自動遞減變址尋址IDX《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器數(shù)據(jù)傳送指令】將源寄存器的內(nèi)容傳送到目的寄存器,共9條指令,均為固有尋址方式。實際上該組指令只有3條,其余指令由匯編程序自動匯編成對應(yīng)的TFR指令,如表中陰影部分所示。源寄存器和目的寄存器可以在9個寄存器中任意選擇,包括MCU內(nèi)部的兩個暫存器TMP2和TMP3?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器數(shù)據(jù)傳送指令】

TFR指令的數(shù)據(jù)傳送規(guī)則:(1)8位到8位或16位到16位,直接傳送;(2)8位到16位,通過符號擴(kuò)展變成16位后傳送;TFRA,X等同于SEXA,X(3)16位到8位,舍棄高位,只傳送低位。

說明:數(shù)據(jù)從8位寄存器傳送到16位寄存器,8位寄存器的內(nèi)容傳送到16位寄存器的低8位,S12自動在目的寄存器的最高有效字節(jié)中執(zhí)行一次符號擴(kuò)展。符號擴(kuò)展原則:如果8位寄存器的最高位是0,則16位寄存器的高8位為$00;如果8位寄存器的最高位是1,則16位寄存器的高8位為$FF?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器數(shù)據(jù)傳送指令】例如:若A=$57,B=$81TFR A,X ;SEX:A→X,(X)=$0057TFR B,Y ;SEX:B→Y,(Y)=$FF81《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器數(shù)據(jù)交換指令】將源寄存器內(nèi)容與目的寄存器內(nèi)容進(jìn)行交換,共3條指令,均為固有尋址方式。實際上該組指令只有1條EXG指令,XGDX和XGDY指令由匯編程序自動匯編成對應(yīng)的EXG指令。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【寄存器數(shù)據(jù)交換指令】該指令可以在任意16位或8位寄存器之間交換數(shù)據(jù),規(guī)則是:(1)8位8位或16位16位,直接交換;(2)8位16位,將8位寄存器內(nèi)容高8位零擴(kuò)展成16位后,傳送到16位寄存器,16位寄存器的低8位傳送到8位寄存器;(3)16位8位,16位寄存器的低8位傳送到8位寄存器,8位寄存器高8位補(bǔ)$00或$FF后,傳送到16位寄存器。其中8位寄存器是A時,高8位補(bǔ)$00;8位寄存器是B或CCR時,高8位補(bǔ)$FF。但以下幾對指令操作并不對應(yīng)EXGD,B ;B→B,$FF→AEXGB,D ;$FF:B→DEXGA,D ;$00:A→DEXGD,A ;BA《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【內(nèi)存數(shù)據(jù)移動指令】可以將源操作數(shù)(一個字或字節(jié))送到目地地址,源操作數(shù)不變。這是S12X僅有的兩條不涉及內(nèi)部寄存器而直接進(jìn)行內(nèi)存單元之間數(shù)據(jù)傳送的指令,支持6種尋址方式?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【內(nèi)存數(shù)據(jù)移動指令】例:MOVB#$0F,PORTT ;IMM-EXT尋址方式MOVW0,X,0,Y ;IDX-IDX尋址方式MOVB#$35,9,Y ;$35→(Y)+9,IMM-IDX尋址方式MOVW#S1234,$1100 ;IMM-EXT尋址方式MOVB$1000,$2000 ;($1000)→$2000,EXT-EXT尋址方式MOVB$1000,5,SP ;($1000)→(SP)+5,EXT-IDX尋址方式MOVB3,X,2,Y ;((X)+3)→(Y)+2,IDX-IDX尋址方式《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【堆棧操作指令】S12X堆棧操作僅限于寄存器與堆棧之間的數(shù)據(jù)傳送,使用堆棧指針進(jìn)行間接尋址。堆棧操作分為進(jìn)棧和出棧兩種,操作循序正好相反,即指針先遞減,后壓棧;先彈出,指針后遞增。指令共計14條,入棧和出棧各7條,均為固有尋址方式。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【例3.1】從BLOCK單元開始有一個無符號數(shù)據(jù)塊,其長度存于LEN單元,試編寫程序,求出數(shù)據(jù)塊中最大的數(shù),并存入DATDMAX單元。LDX#BLOCK ;數(shù)據(jù)塊首地址賦給X寄存器LDABLEN ;LEN單元的數(shù)據(jù)塊長度裝入B寄存器LDAABLOCK ;取數(shù)據(jù)塊中第一個數(shù)裝入A中。DECB ;第一個數(shù)取出后,數(shù)據(jù)塊長度減1。DONE:MAXA$01,X+;max[(A),(M(X))]→A,(X)+1→XDECB ;(B)-1→B,計數(shù)器減1BNEDONE ;計數(shù)器不為零,循環(huán)。STAADATDMAX ;A→DATDMAXHERE:BRAHERE;原地踏步《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令【例3.2】試編寫程序,查找在內(nèi)部RAM的$1020~$1050單元中是否有$AA這一數(shù)據(jù),若有這一數(shù)據(jù),則將$1051單元置為$01;若未找到,則使$1051單元置0。LDX#$1020 ;$1020→XLDAB#$31 ;數(shù)據(jù)塊長度裝入B寄存器LDAA#$AA ;$AA→A。DONE:CMPA$01,X+;(A)=(M(X))?,(X)+1→XBNENEXT ;結(jié)果不為零轉(zhuǎn)移MOVB#$01,$1051 ;結(jié)果為零,有$AA這一數(shù)據(jù),$01→$1051BRAHERENEXT:DECB ;(B)-1→B,計數(shù)器減1BNEDONE ;計數(shù)器不為零,循環(huán)。CLR$1051 ;$00→$1051HERE:BRAHERE;原地踏步《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)【例3.3】試編寫程序,查找在內(nèi)部RAM的$1020~$1050單元內(nèi)出現(xiàn)$AA的次數(shù),并將查找的結(jié)果存入$1051單元。LDX#$1020 ;$1020→XLDAB#$31 ;數(shù)據(jù)塊長度裝入B寄存器LDAA#$AA ;$AA→ACLR$1051 ;$00→$1051DONE:CMPA$01,X+;(A)=(M(X))?,(X)+1→XBNENEXT ;結(jié)果不為零轉(zhuǎn)移INC$1051 ;結(jié)果為零,有$AA這一數(shù)據(jù),$01→$1051NEXT:DECB ;(B)-1→B,計數(shù)器減1BNEDONE ;計數(shù)器不為零,循環(huán)。HERE:BRAHERE;原地踏步《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)【例3.4】閱讀下列程序,要求:1)說明程序的功能。2)寫出X、Y寄存器的最后結(jié)果。ORG$E000LDX#$C000 ;$C000→X,初始化源指針LDY#$C500 ;$C500→Y,初始化目的指針LDAB#$10 ;$10→B,初始化計數(shù)器DOWH:LDAA$01,X+;((X))→A,X+1→X,從源地址移動字節(jié)STAA$01,Y+ ;A→(Y),Y+1→Y,存儲到目的地址DECB ;(B)-1→B,計數(shù)器減1BNEDOWN ;計數(shù)器不為零,循環(huán)。HERE:BRAHERE;原地踏步程序功能:把從地址$C000開始的16個字節(jié)數(shù)據(jù)傳送到從$C500開始的地址單元中。程序執(zhí)行后:X=$C010,Y=$C510?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.1數(shù)據(jù)傳送指令采用MOVW2,X+,2,Y+指令一次可以傳送一個字,且避免通過累加器A作為中間寄存器,使程序精簡和節(jié)省程序運(yùn)行時間。采用類似的方法,可使累加器A左移B中所指定的次數(shù):ORG$E000CMPB#$00 ;判別B中是否為零。BEQHERE ;如果B=0,則不進(jìn)入循環(huán)。DONE:LSLA;循環(huán)開始,算術(shù)左移。A.7→c,0→A.0。DECB ;(B)-1→B,計數(shù)器減1BNEDONE ;計數(shù)器不為零,循環(huán)。HERE:BRAHERE;原地踏步《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【加法指令】S12X加法運(yùn)算分為兩類,一類是兩個寄存器內(nèi)容的加法,另一類是寄存器內(nèi)容與立即數(shù)或內(nèi)存單元內(nèi)容的加法,運(yùn)算結(jié)果保存在寄存器中,所有加法指令都影響標(biāo)志位。兩個寄存器的加法共有3條指令,但ABX和ABY指令由匯編程序自動匯編成對應(yīng)的LEAX指令,如表中陰影部分所示?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【加法指令】寄存器內(nèi)容與立即數(shù)或內(nèi)存單元內(nèi)容的加法,共有10條指令,支持8種尋址方式,由此派生出80條指令。其中5條為帶進(jìn)位的加法指令,5條為不帶進(jìn)位的加法指令。表中后5條指令是CPU12X新增的指令,包括3條帶進(jìn)位的16位加法指令。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)【例3.5】閱讀下列程序段,要求:1)說明程序的功能。2)寫出程序執(zhí)行后涉及到的寄存器和內(nèi)存單元的最后結(jié)果。程序運(yùn)行前,($0800)=$30,($0801)=$8B,($0802)=$52,($0803)=$96,($1000)=$47,($1001)=$28,($1002)=$D6,($1003)=$40。LDD $0802 ;($0802:$0803)→DADDD$1002 ;(D)+($1002:$1003)→DSTD$2002 ;(D)→$2002:$2003LDD$0800 ;($0800:$0801)→A:BADCB$1001 ;(B)+($1001)+c→BADCA$1000 ;(A)+($1000)+c→ASTD$2000 ;(D)→$2000:$2001LOOP:BRALOOP ;原地踏步程序功能:雙字加法。將內(nèi)存單元$0800~$0803中的內(nèi)容與內(nèi)存單元$1000~$1003中的內(nèi)容相加,結(jié)果存放在$2000~$2003中,高位字節(jié)在低地址單元。程序執(zhí)行后:存放被加數(shù)和加數(shù)的地址單元內(nèi)容不變。D=$77B4,($2000)=$77,($2001)=$B4,($2002)=$28,($2003)=$D6?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)【例3.6】閱讀下列程序,要求:1)說明程序的功能。2)寫出X、Y寄存器的最后結(jié)果。ORG$8000ADD_8BT:LDX#$0A07;$0A07→X,X指向被加數(shù)的最低位LEAY8,X ;Y=(X)+$8=$0A07+$8=$0A0F,指向加數(shù)的最低位LDAB#8 ;$8→B,計數(shù)器(共8個字節(jié)) CLC ;清除進(jìn)位標(biāo)志LOOP_EX:LDAA,X;取1個字節(jié)被加數(shù)ADCA,Y+ ;(A)+((Y))+c→A,Y+1→YSTAA,X+ ;(A)→(X),結(jié)果保存到被加數(shù)的位置,X+1→XDBNEB,LOOP_EX ;循環(huán)8次,不破壞進(jìn)位位的狀態(tài)LOOP:BRALOOP;原地踏步程序功能:將兩個8字節(jié)數(shù)相加,結(jié)果保存在原被加數(shù)所在的位置。程序執(zhí)行后:X=$0A10,Y=$0A17?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【減法指令】S12X減法運(yùn)算也分為兩類,一類是兩個寄存器內(nèi)容的減法,另一類是寄存器內(nèi)容與立即數(shù)或內(nèi)存單元內(nèi)容的減法,運(yùn)算結(jié)果保存在寄存器中,所有減法指令都影響標(biāo)志位。兩個寄存器內(nèi)容的減法指令為SBA,計算A、B之差,結(jié)果存放在A中,為固有尋址指令。寄存器內(nèi)容與立即數(shù)或內(nèi)存單元內(nèi)容的減法,共有10條指令,支持8種尋址方式,由此派生出80條指令。其中5條為帶借位的減法指令,6條為不帶借位的減法指令。表中后5條指令是CPU12X新增的指令,包括3條帶借位的16位減法指令。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【減法指令】《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)【例3.7】閱讀下列程序段,要求:1)說明程序的功能。2)寫出程序執(zhí)行后涉及到的寄存器和內(nèi)存單元的最后結(jié)果。程序運(yùn)行前,($0800)=$87,($0801)=$D5,($0802)=$3C,($0803)=$62,($1000)=$54,($1001)=$F8,($1002)=$76,($1003)=$39。LDD $0802 ;($0802:$0803)→DSUBD$1002 ;(D)-($1002:$1003)→DSTD$2002 ;(D)→$2002:$2003LDD$0800 ;($0800:$0801)→A:BSBCB$1001 ;(B)-($1001)-c→BSBCA$1000 ;(A)-($1000)-c→ASTD$2000 ;(D)→$2000:$2001LOOP:BRALOOP ;原地踏步程序功能:雙字減法。將內(nèi)存單元$0800~$0803中的內(nèi)容減去內(nèi)存單元$1000~$1003中的內(nèi)容,結(jié)果存放在$2000~$2003中,高位字節(jié)在低地址單元。程序執(zhí)行后:存放被減數(shù)和減數(shù)的地址單元內(nèi)容不變。D=$C629,($2000)=$32,($2001)=$DC,($2002)=$C6,($2003)=$29?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【加1和減1指令】S12X分別具有一組用于指針調(diào)整或循環(huán)控制的加1和減1指令,每組有9條指令,操作對象是寄存器A、B、X、Y、SP或內(nèi)存單元,如表3.13和表3.14所示。其中,寄存器A、B、X、Y加1或減1指令為固有尋址,對內(nèi)存單元的操作則支持6種尋址方式。需要注意的是,INS和DES指令是為兼容68HC11而保留,由匯編程序自動匯編成對應(yīng)的LEAS指令,為變址尋址IDX方式,如表3.13和表3.14中陰影部分所示。兩個表中的后3條指令是CPU12X新增的指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【加1和減1指令】《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【加1和減1指令】《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【十進(jìn)制調(diào)整指令】S12X只有1條十進(jìn)制調(diào)整指令DAA,根據(jù)標(biāo)志H、C和A中數(shù)值的大小做BCD調(diào)整,調(diào)整規(guī)則是:(1)如果A中的低4位>9或標(biāo)志H=1,則A=A+$06;(2)如果A中的高4位>9或標(biāo)志C=1,則A=A+$60,同時重置標(biāo)志C。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)

【例3.8】閱讀下列程序段,要求:1)說明程序的功能。2)寫出程序執(zhí)行后D寄存器的最后結(jié)果。LDD#$7527;$7527→DADDB#$75;(B)+$75→B(=$9C),c=0,H=0,低半字節(jié)大于10,+6調(diào)整。EXGA,B;A?B,將B內(nèi)容交換到A,以便進(jìn)行十進(jìn)制調(diào)整。DAA ;低位字節(jié)十進(jìn)制調(diào)整,結(jié)果A=$02,c=1EXGA,B;A?B,將低位字節(jié)調(diào)整結(jié)果放回到B,將高位字節(jié)換回到AADDC#$10;A+$10+c→A(=$86),c=0,H=0,無需進(jìn)行十進(jìn)制調(diào)整。LOOP:BRALOOP;原地踏步程序功能:利用BCD運(yùn)算求十進(jìn)制數(shù)7527與1075的和,結(jié)果放在累加器D中。程序執(zhí)行后:D=$8602?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【清零指令】清零指令用來向寄存器或內(nèi)存單元中寫入$00,功能上與加載立即數(shù)$00的指令相同,共有6條指令。寄存器清零針對A、B、X和Y,為固有尋址方式。內(nèi)存單元清零指令支持6種尋址方式,既可以清零某一個內(nèi)存單元,也可以清零連續(xù)兩個內(nèi)存單元。表中的后3條指令是CPU12X新增的指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【符號擴(kuò)展指令】單字節(jié)無符號數(shù)通過高位補(bǔ)0可以擴(kuò)展成任意寬度,而對于有符號數(shù),由于采用補(bǔ)碼表示,高位可能需要補(bǔ)0或補(bǔ)1,因此,S12X設(shè)置了符號擴(kuò)展指令SEX,為固有尋址方式。符號擴(kuò)展過程是,將原數(shù)據(jù)符號位復(fù)制到已擴(kuò)展數(shù)據(jù)的所有高位。指令要求源操作數(shù)是A、B或CCR中的內(nèi)容,擴(kuò)展后的結(jié)果存放在D、X、Y或SP中。SEX還可以擴(kuò)展雙字節(jié)數(shù),是CPU12X新增的指令,此時要求源操作數(shù)是D中的內(nèi)容,擴(kuò)展后的結(jié)果存放在X或Y中。此時,如果16位數(shù)據(jù)的最高位為0,結(jié)果寄存器存入$0000,如果16位數(shù)據(jù)的最高位為1,結(jié)果寄存器存入$FFFF。指令格式為:

SEXR1,R2;R1=A、B或CCR,R2=D、X、Y或SP,相當(dāng)于TFRR1,R2《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【乘法指令】S12X乘法全部在寄存器內(nèi)完成,可以實現(xiàn)兩個8位或16位的硬件乘法運(yùn)算,共有3條指令,均為固有尋址方式。MUL指令將A、B內(nèi)容按無符號數(shù)相乘,結(jié)果存在寄存器D中,同時將結(jié)果的D7位(累加器B中的最高位)送到標(biāo)志C中,作為按四舍五入的依據(jù),后跟一條ADCA#$00指令便可實現(xiàn)四舍五入。因此,這時的進(jìn)位位C與加法時的含義完全不同。

EMUL和EMULS指令的區(qū)別在于,EMULS指令的結(jié)果用補(bǔ)碼表示。《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【乘法指令】例如,分別用無符號和有符號乘法指令計算$8000$4000LDD #$8000 ;32768LDY #$4000 ;16384EMUL ;Y=$2000,D=$0000,按無符號數(shù)運(yùn)算3276816384=536870912=$20000000LDD #$8000 ;-32768LDY #$4000 ;+16384EMULS ;Y=$E000,D=$0000,按有符號數(shù)運(yùn)算-3276816384=-536870912=$E0000000《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)【乘法指令】【例3.9】計算$4000~$407F單元所有字節(jié)數(shù)據(jù)的平方,并把計算結(jié)果存放在$4080開始的單元中,按字方式存儲。ORG $8000MAIN: LDS #$0800 ;定義堆棧 LDX #$4000 ;初始化數(shù)據(jù)塊指針 LDY #$4080 ;LOOP1: JSR SQUARE ;求平方循環(huán) INX ;指向下一個數(shù)據(jù) CPX #$4080 ;所有數(shù)據(jù)的平方是否計算完畢? BNE LOOP1 ;未完,循環(huán)HERE: BRA HERE ;原地踏步SQUARE: LDAA $00,X ;((X))→A,取1個數(shù)據(jù) TAB ;(A)→B MUL ;計算數(shù)據(jù)的平方 STD $02,Y+ ;保存結(jié)果 RTS《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【除法指令】S12X除法全部在寄存器內(nèi)完成,可以實現(xiàn)16/16位或32/16位的硬件除法運(yùn)算,共有5條指令,均為固有尋址方式。FDIV、IDIV、IDIVS3條是16/16除法指令,被除數(shù)在D中,除數(shù)在X中,商在X中,余數(shù)在D中?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【除法指令】FDIV是小數(shù)除法指令,實際上是求真分?jǐn)?shù)D/X的值。其中D、X都是無符號整數(shù)或小數(shù)點位置相同的小數(shù),因此,商是一個小于1的二進(jìn)制小數(shù)。運(yùn)算過程相當(dāng)于先將D內(nèi)容乘以216,然后進(jìn)行32位除以16位(X內(nèi)容)的除法運(yùn)算,商在X中,余數(shù)在D中,然后商(X內(nèi)容)再除以216,相當(dāng)于將小數(shù)點移到最高位的左邊。保存商,然后再恢復(fù)除數(shù)X,可以讓余數(shù)(D)再次除以X,如此循環(huán)反復(fù),可以使商的位數(shù)向小數(shù)點后面不斷延伸,直到滿足要求為止。IDIV和IDIVS分別是無符號和有符號整數(shù)16/16除法指令,區(qū)別在于IDIVS指令的商和余數(shù)用補(bǔ)碼表示?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)【例3.10】閱讀下列程序,要求:1)說明程序的功能。2)寫出D、X寄存器和相關(guān)內(nèi)存單元的最后結(jié)果。已知程序執(zhí)行前($A000)=$80,($A001)=$03,($A002)=$00,($A003)=$53。LDD$A000 ;($A000:$A001)→D,裝載分子LDX$A002 ;($A002:$A003)→X,裝載分母IDIV ;16位除16位無符號整數(shù)除法STX$A004 ;X→$A004:$A005,保存整數(shù)結(jié)果LDX$A002 ;($A002:$A003)→X,重新裝載分母FDIV ;除以前面的余數(shù),得到小數(shù)。16位除16位小數(shù)除法。STX$A006 ;X→$A006:$A007,保存小數(shù)LAST:BRALAST;原地踏步程序功能:將內(nèi)存單元$A000:$A001中的兩個字節(jié)數(shù)據(jù)除以$A002:$A003中的兩個字節(jié)數(shù)據(jù),把整數(shù)結(jié)果保存在$A004:$A005單元中,小數(shù)保存在$A006:$A007單元中。被除數(shù)為$8003(32771),除數(shù)為$0053(83),結(jié)果為$018A.D4D1,即十進(jìn)制的394.831,32771/83=394.831,0.831=54481/65536,D4D1=54481。程序執(zhí)行后:X=$D4D1,D=$003D,($A004)=$01,($A005)=$8A,($A006)=$D4,($A007)=$D1?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【比較指令】比較指令用于將寄存器的內(nèi)容與立即數(shù)或內(nèi)存單元內(nèi)容進(jìn)行比較,實際上進(jìn)行的是兩個操作數(shù)的減法運(yùn)算,因此將其劃歸在算術(shù)運(yùn)算類指令。但它們并不回送運(yùn)算結(jié)果,只是根據(jù)差值設(shè)置相應(yīng)的狀態(tài)位,作為跳轉(zhuǎn)、循環(huán)等的判斷條件。這類指令影響標(biāo)志位N、Z、V、C。比較指令共有11條,除了CBA為固有尋址方式外,其余10條指令允許使用8種尋址方式,可派生出80條指令。其中,表中后4條帶借位位的16位比較指令是CPU12X新增的指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【比較指令】《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)【比較指令】

【例3.11】閱讀該程序段,要求:1)說明程序的功能。2)寫出程序執(zhí)行后涉及到的寄存器和內(nèi)存單元的最后結(jié)果。程序運(yùn)行前,($2005)=$0A,($2006)=$5C,($2007)=$71,($2008)=$3E,($2009)=$89,($200A)=$15,($200B)=$B2,($200C)=$00,($200D)=$B6,($200E)=$6C,($200F)=$CD。ORG$E000 ;程序起始地址LDS#$FF ;初始化SP,$00FF→SPLDAB$2005 ;($2005)→B,讀取計數(shù)值,數(shù)據(jù)塊長度在$2005中CLRA ;清累加器A,初始比較值為0LDX#$2006 ;$2006→X,指向數(shù)據(jù)塊的起始地址THERE:CMPA0,X ;(A)>(M)?,當(dāng)前最大值>當(dāng)前值嗎?BHINOCHG ;如果C|Z=0,則PC+2+rel→PC,是,保持最大值LDAA0,X ;不是,用當(dāng)前值替代最大值,((X))→ANOCHG:INX ;X+1→X,指向下一個數(shù)據(jù)DECB ;B-1→B,計數(shù)器減1BNETHERE ;如果B≠0,則轉(zhuǎn)移;未查找完,則循環(huán)STAA$2004 ;保存最大值HERE:BRAHERE ;原地踏步程序功能:從地址為$2006開始的10個單元中,找出數(shù)據(jù)塊中最大的數(shù),并存入$2004單元。程序執(zhí)行后:($2004)=$CD,A=$CD,X=$2010?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.2算術(shù)運(yùn)算指令【測試指令】測試指令用于檢測累加器A、B、X、Y或內(nèi)存單元的內(nèi)容是否≥0,相當(dāng)于一次減0操作。操作后,源操作數(shù)不變,也不保存結(jié)果,只是根據(jù)結(jié)果設(shè)置標(biāo)志位。該類指令有6條,其中,TSTA、TSTB、TSTX和TSTY為固有尋址,TST和TSTW允許使用6種尋址方式,表中最后3條指令是CPU12X新增的指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.3邏輯運(yùn)算指令S12X的邏輯運(yùn)算指令包括基本邏輯運(yùn)算、取反和求補(bǔ)、移位、位操作、位邏輯運(yùn)算和位測試等指令?!净具壿嬤\(yùn)算指令】基本邏輯運(yùn)算指令按字節(jié)或字進(jìn)行“與”、“或”、“異或”邏輯運(yùn)算,用于將寄存器中的某些位清0或置1,共有14條指令。其中,針對CCR的操作只允許立即尋址,針對累加器A、B、X和Y的操作支持8種尋址方式,派生出96條指令。按字進(jìn)行邏輯運(yùn)算的指令是CPU12X新增的指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.3邏輯運(yùn)算指令【基本邏輯運(yùn)算指令】《MC9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.3邏輯運(yùn)算指令【取反、求補(bǔ)指令】取反、求補(bǔ)指令將累加器A、B、X、Y或內(nèi)存單元內(nèi)容取反和求補(bǔ),結(jié)果放回原處,共有12條指令。針對累加器A、B、X、Y的操作為固有尋址,針對內(nèi)存單元的操作支持6種尋址方式,派生出24條指令。按字進(jìn)行取反和求補(bǔ)操作的指令是CPU12X新增的指令?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)3.4S12X匯編指令系統(tǒng)3.4.3邏輯運(yùn)算指令【取反、求補(bǔ)指令】取反指令相當(dāng)于執(zhí)行一次$FF-(r)或$FF-(M)操作,顯然V=0,C也應(yīng)該為0,但為了兼容以前M6800系列而將C置1,N、Z標(biāo)志意義不變。求補(bǔ)指令實際上進(jìn)行一次$00-(r)或$00-(M)的減法操作,可以理解為取反加1操作,因此,對標(biāo)志位的影響與減法一致。其中,N、Z標(biāo)志的意義不變,但V、C則比較特殊:(1)當(dāng)操作數(shù)=$80時,執(zhí)行結(jié)果仍為$80,此時,V=1;當(dāng)操作數(shù)≠$80時,執(zhí)行后V=0。(2)當(dāng)操作數(shù)=0時,C=0;否則,C=1,因為0減去任何不為0的數(shù),都要產(chǎn)生借位?!禡C9S12XS單片機(jī)原理及嵌入式系統(tǒng)開發(fā)》第3章S12X指令系統(tǒng)【取反、求補(bǔ)指令】【例3.12】閱讀下列程序段,要求:1)說明程序的功能。2)若程序執(zhí)行前($3000)=$D8,寫出程序執(zhí)行后A、B寄存器的最后結(jié)果。FD-ABS:LDAA$3000 ;($3000)→ACMPA#$00 ;(A)-$00,檢驗A中是否為正數(shù)。以下3行是求絕對值。BGEA_PLUS ;如果N⊕V=0,即A>$00,是正數(shù),轉(zhuǎn)移。NEGA ;$00-(A)→A,是負(fù)數(shù),求其相反數(shù)(求補(bǔ)碼)。A_PLUS:TAB ;(A)→B,得到A的絕對值并放在B中。LOOP:BRALOOP ;原地踏步M2P:LDAA$3000 ;($3000)→A,A=$D8,這兩行程序求補(bǔ)數(shù)$64-(A)的值。NEGA ;$00-(A)→A,是負(fù)數(shù),求其相反數(shù)。ADDA#$64 ;(A)+$64

溫馨提示

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

評論

0/150

提交評論