




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、freescale 8位單片機(jī)指令系統(tǒng)hcs08 cpu指令表hcs08指令系統(tǒng)共有120條基本指令,每一條指令又有各自不同的尋址方式,根據(jù)這些基本指令的功能,現(xiàn)將其分為以下六類: 算術(shù)算術(shù)運(yùn)算運(yùn)算數(shù)據(jù)數(shù)據(jù)傳送傳送邏輯邏輯操作操作程序程序控制控制移位類移位類指令指令指令系統(tǒng)分類指令系統(tǒng)分類位操作位操作數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令這組指令用于存儲(chǔ)器和cpu 寄存器間、存儲(chǔ)器單元間或者cpu 寄存器間的數(shù)據(jù)轉(zhuǎn)移。讀入、存儲(chǔ)和數(shù)據(jù)傳送等指令根據(jù)數(shù)據(jù)的值自動(dòng)更新條件碼自動(dòng)更新條件碼。這允許beq、bne、bpl 和bmi 等在載入、儲(chǔ)存和數(shù)據(jù)傳送指令后不需要運(yùn)行特殊的測(cè)試或比較指令,而立即進(jìn)行條件轉(zhuǎn)移。l
2、oad a 和load x是從存儲(chǔ)器中取出一個(gè)8位數(shù)放入累加器a或寄存器x。load h:x是從存儲(chǔ)器中取出8位的數(shù)放入寄存器h,然后再?gòu)南乱粋€(gè)存儲(chǔ)單元取出8位數(shù)放入寄存器x。為了盡可能靈活的訪問存儲(chǔ)器,加載a 或x 都可使用8 種不同的尋址方式。而ldhx 可有7種不同的尋址方式來(lái)指定所取數(shù)的存儲(chǔ)單元。下列代碼展示了加載指令的某些用法。這些指令在實(shí)際程序中并不這樣用,它們只是些無(wú)關(guān)聯(lián)的加載指令,用來(lái)說(shuō)明可用不同方式來(lái)訪問存儲(chǔ)器的多種可行的尋址方式.因?yàn)椴僮鲾?shù)進(jìn)入alu 需要用到累加器a,所以通常在執(zhí)行算術(shù)與邏輯操作時(shí),要使用lda 指令取得一個(gè)值,以便與第2 個(gè)操作數(shù)進(jìn)行運(yùn)算。;求a+b的和
3、(假設(shè)總和累加器add oprb ;立即數(shù)a+立即數(shù)b-累加器在有些情況下,可設(shè)計(jì)程序使得放在累加器a 中的運(yùn)算結(jié)果能用來(lái)作為后續(xù)運(yùn)算的操作數(shù)。這樣可以避免存儲(chǔ)結(jié)果的過(guò)程以及將下一個(gè)操作數(shù)放入累加器的必要。;求a+b+c的和(假設(shè)總和累加器add oprb ;立即數(shù)a+立即數(shù)b-累加器add oprc ;累加器+立即數(shù)c-累加器下面展示了中間值保存在堆棧中的例程。有時(shí)這樣做比將臨時(shí)結(jié)果存儲(chǔ)在存儲(chǔ)器中要快。存儲(chǔ)的數(shù)量依賴于用何種尋址方式放置臨時(shí)變量至存儲(chǔ)器以及x 寄存器是否被其他操作所使用.;計(jì)算(a+b)-(c+d)(假設(shè)沒有進(jìn)位或借位)lda oprc ;立即數(shù)c-累加器add oprd ;
4、立即數(shù)c+立即數(shù)d-累加器psha ;中間結(jié)果放入堆棧sp+1lda opra ;立即數(shù)a-累加器add oprb ;立即數(shù)a+立即數(shù)b-累加器sub 1,sp ;(a+b)-(c+d)結(jié)果放入累加器ais #1 ;釋放一個(gè)變量tax 和txa 提供了一個(gè)有效的方法來(lái)把a(bǔ) 寄存器的值送到x 寄存器或者把寄存器x 的值送到寄存器a。如果寄存器x 未被使用,可以用來(lái)暫存累加器a 中的值,這樣累加器就可以用來(lái)做其他操作。tap 和tpa 提供了一個(gè)方法在寄存器a 到ccr 中或者從ccr 到寄存器a 傳送數(shù)據(jù)。這種操作在類似調(diào)試監(jiān)控等開發(fā)工具中比在通常用戶程序中使用得更多。mov指令從存儲(chǔ)器區(qū)讀一個(gè)
5、8 位數(shù)值,并將這個(gè)數(shù)值存儲(chǔ)到存儲(chǔ)區(qū)的其他地方。就像加載和存儲(chǔ)指令一樣,mov 根據(jù)被移動(dòng)數(shù)據(jù)的值改變ccr 中n 和和z 標(biāo)志位。盡管加載和存儲(chǔ)指令能夠完成盡管加載和存儲(chǔ)指令能夠完成mov 所做的事情,但mov 不需要使用累加器,在傳送操作期間,累加器a 能夠正常使用。在許多情況下,mov 比加載-存儲(chǔ)指令更快更小(目標(biāo)代碼的大小)。mov 指令允許四種從指定源到目標(biāo)的不同的尋址方式。下面的例子展示了使用傳送指令初始化幾個(gè)寄存器的值。284 c0db 6e 03 00 mov #$03,ptad ;0011到低4位285 c0de 6e 0f 03 mov #$0f,ptadd ;使得低4位
6、為輸出286 c0e1 6e f0 01 mov #$f0,ptape ;上拉高4位下面例子展示了使用加載和存儲(chǔ)指令實(shí)現(xiàn)字符串移動(dòng)字符串移動(dòng)操作數(shù),而不用傳送指令。;塊移動(dòng)例子,移動(dòng)字符串到ram塊45 0088 ldhx #moveblk1 ;指向ram目標(biāo)塊d6 bf7f movloop1: lda (stringbytes-moveblk1),x ;得到源字節(jié)27 04 beq dunloop1 ;結(jié)束循環(huán)的條件f7 sta ,x ;保存到目標(biāo)塊5c incx ;下一個(gè)位置(假設(shè)直接尋址)20 f7 bra movloop1 ;繼續(xù)循環(huán) dunloop1: 算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令包含了
7、傳統(tǒng)的加、減、乘和除操作,還包含常用的指令如加一、減一、清零、求補(bǔ)(2 進(jìn)制補(bǔ)碼)、比較、測(cè)試和為處理bcd 碼的十進(jìn)制調(diào)整指令。比較指令實(shí)際上就是減操作,影響ccr 狀態(tài)位但結(jié)果不返回到cpu 寄存器。測(cè)試指令影響著n和z 位,但是不影響被測(cè)試的數(shù)據(jù)。add 指令將寄存器a 中的數(shù)據(jù)加上存儲(chǔ)器內(nèi)的操作數(shù),并將結(jié)果存儲(chǔ)到寄存器a中。adc 將寄存器a 中的數(shù)據(jù)加上由前一次操作產(chǎn)生的進(jìn)位,再加上存儲(chǔ)器中的操作數(shù),將結(jié)果存儲(chǔ)到寄存器a 中。該操作允許執(zhí)行多字節(jié)加法,就像下例所示。;8位操作數(shù)到24位和的加法lda opra ;取8位操作數(shù)到寄存器aadd sum24+2 ;24位和的低字節(jié)sta
8、sum24+2 ;更新24位和的低字節(jié)lda sum24+1 ;取24位和的中間字節(jié)adc #0 ;保持任何進(jìn)位sta sum24+1 ;更新中間字節(jié)lda sum24 ;得到24位和的高字節(jié)adc #0 ;保持進(jìn)位到高字節(jié)中sta sum24 ;更新高字節(jié)sub 指令將累加器a 中的數(shù)據(jù)減去存儲(chǔ)器中的數(shù)據(jù),然后將結(jié)果存儲(chǔ)到累加器a中。對(duì)于這個(gè)指令,進(jìn)位狀態(tài)位是借位指示器。sbc 指令將累加器a 中的數(shù)據(jù)減去由前一次操作所影響的借位再減去存儲(chǔ)器中的數(shù)據(jù),然后將結(jié)果存儲(chǔ)回寄存器a 中。這個(gè)操作允許執(zhí)行多字節(jié)減法,就像下面例子所顯示的。;16位減法.結(jié)果是16位=opre-oprflda opre
9、+1 ;opre的低8字節(jié)sub oprf+1 ;opre(低字節(jié))-oprf(低字節(jié))sta result16+1 ;結(jié)果的低字節(jié)lda opre ;opre的高字節(jié)sbc oprf ;opre(高字節(jié))-oprf(高字節(jié))-借位sta result16 ;結(jié)果的高字節(jié)mul 指令將寄存器x中無(wú)符號(hào)8位2進(jìn)制數(shù)與累加器a中的無(wú)符號(hào)的8 位2進(jìn)制數(shù)相乘,然后存儲(chǔ)16位結(jié)果到x:a 中,高8 位的結(jié)果存儲(chǔ)在x中,低8位存儲(chǔ)在a中。這種情況下不可能發(fā)生進(jìn)位(或者是溢出),其結(jié)果將總是適合x:a 的大小。因此在這個(gè)操作后c 將被清零。div 將h:a 中16 位無(wú)符號(hào)數(shù)除以x中無(wú)符號(hào)的8位值,然后存
10、儲(chǔ)8位結(jié)果到a寄存器中,余數(shù)存儲(chǔ)到h寄存器中。在x中的除數(shù)無(wú)變化,因此他能夠在隨后的操作中被使用。如果商為0則z標(biāo)志被置1。如果商大于255 就會(huì)有溢出發(fā)生,如果發(fā)生溢出或除數(shù)為0 則c 位被置1。下面這個(gè)除法的例子展示了簡(jiǎn)單8 位除以8 位得到一個(gè)8 位的結(jié)果。;8/8整數(shù)除法.a=a/xclrh ;清零被除數(shù)高字節(jié)lda divid8 ;加載8位被除數(shù)ldx divisor ;加載除數(shù)div ;h:a/x-a,余數(shù)-hsta quotient8 ;保存結(jié)果另一個(gè)除法的例子證明了怎樣使用div 指令來(lái)執(zhí)行一個(gè)8 位到8 位的除法,并得到小數(shù)部分的結(jié)果(可以精確到小數(shù)點(diǎn)后8 位)。;8/8 整
11、數(shù)除法,將余數(shù)變?yōu)?位的小數(shù)位;r8.f8=a/x,將余數(shù)變?yōu)?位的小數(shù)位;16位的結(jié)果-(8位整數(shù)).(8位小數(shù))clrh ;清零被除數(shù)的高字節(jié)lda divid8 ;加載8位被除數(shù)ldx divisor ;加載除數(shù)div ;h:a/x-a,余數(shù)-hsta quotient16 ;結(jié)果的高字節(jié)保存整數(shù)部分clra ; h:a=余數(shù):0div ;h:a/x-asta quotient16+1 ;低字節(jié)放小數(shù)部分第三個(gè)除法的例子。用一個(gè)8 位的被除數(shù)來(lái)除一個(gè)大于8 位的除數(shù)得到16 位的小數(shù)結(jié)果,小數(shù)點(diǎn)在結(jié)果最高位的左邊。在二進(jìn)制中,msb 的數(shù)值是整個(gè)數(shù)值的一半,右邊的下一位占四分之一,依次類
12、推。;8/8小數(shù)除法,16位的小數(shù)結(jié)果;r16=h/x,結(jié)果是一個(gè)16位的二進(jìn)制小數(shù);在h和x中,假設(shè)基數(shù)是在相同的位置;16位的結(jié)果-.(16位的小數(shù));除數(shù)和被除數(shù)都被定義了,因此用ldhx加載h和xclra ;清零ls字節(jié)的被除數(shù)ldhx divid8 ;h:x=被除數(shù):除數(shù)div ;h:a/x-a,余數(shù)-hsta quotient16 ;結(jié)果的高字節(jié)clra ;h:a=余數(shù):0div ;h:a/x-asta quotient16+1 ;結(jié)果的低字節(jié)第四個(gè)除法例子使用了類似長(zhǎng)除法的技術(shù),完成16 位整數(shù)除以8 位的數(shù)的操作.;極大的16/8整數(shù)除法(相當(dāng)于長(zhǎng)除法);r16.f8=h:a/
13、x,結(jié)果是16位整數(shù),8位二進(jìn)制小數(shù)clrh ;清零被除數(shù)的高字節(jié)lda divid16 ;被除數(shù)的高字節(jié)ldx divisor ;裝載除數(shù)div ;h:a/x-a,余數(shù)-hsta quotient24 ;結(jié)果的高字節(jié)lda divid16+1 ;h:a=余數(shù):被除數(shù)(低字節(jié))div ;h:a/x-a,余數(shù)-hsta quotient24+1 ;結(jié)果的下一個(gè)字節(jié)clra ;h:a=余數(shù):0div ;h:a/x-asta quotient24+2 ;結(jié)果的小數(shù)位第五個(gè)例子展示了通過(guò)檢查溢出來(lái)實(shí)現(xiàn)16 位數(shù)除以8 位數(shù)的操作。;有限的16/8整數(shù)除法(帶溢出檢查);r8= h:a/x,結(jié)果是8位的
14、整數(shù)ldhx divid16 ;h:x=16位的被除數(shù)txa ;h:a=16位的被除數(shù)ldx divisor ;x=8位的除數(shù)div ;h:a/x-a,余數(shù)-hbcs divovrflow ;是否溢出sta quotient8 ;結(jié)果的高字節(jié)divovrflow: ;溢出轉(zhuǎn)到這里加一、減一、清零和求補(bǔ)加一、減一、清零和求補(bǔ) 加一與減一指令可以通過(guò)加1 或減1 調(diào)整寄存器a、x 或存儲(chǔ)器或存儲(chǔ)器內(nèi)的數(shù)據(jù)。清零指令可以將寄存器a、x、h 或者存儲(chǔ)器中的8 位數(shù)值強(qiáng)制改為0。求補(bǔ)指令執(zhí)行了二進(jìn)制補(bǔ)碼操作,求補(bǔ)指令等同于將一個(gè)8 位有符號(hào)數(shù)乘以-1。功能上等同于將寄存器a、x 或者存儲(chǔ)器中的數(shù)據(jù)全部全
15、部取反,然后加上一取反,然后加上一。數(shù)據(jù)$80 表示有符號(hào)數(shù)值負(fù)128,而不是+128。因?yàn)槭褂? 位2 進(jìn)制補(bǔ)碼所能表示的最大是+127。如果寄存器的值是$80 然后若執(zhí)行nega 指令,cpu 首先反轉(zhuǎn)所有的位獲得$7f,然后再加1 得$80。因?yàn)檫@個(gè)原因如果一個(gè)數(shù)據(jù)的符號(hào)由正變負(fù),在ccr 中的v 標(biāo)志位將標(biāo)示為溢出錯(cuò)誤。比較和測(cè)試比較和測(cè)試cmp 指令影響ccr 的位,就像相應(yīng)的sub 指令。但其結(jié)果不會(huì)存儲(chǔ)回累加器中,因此a 寄存器和存儲(chǔ)器操作數(shù)是不發(fā)生變化的。比較指令是比較寄存器a、x 或h:x內(nèi)容與存儲(chǔ)器中的操作數(shù)。在cphx 指令執(zhí)行時(shí),m 指向存儲(chǔ)位置的首地址,h 與存儲(chǔ)器位
16、置m 相對(duì)應(yīng),x 和存儲(chǔ)器位置m+1 相對(duì)應(yīng)。cphx 執(zhí)行一個(gè)16 位減法指令(存儲(chǔ)結(jié)果不返回h:x 中)。測(cè)試指令是將寄存器a、x 或者存儲(chǔ)器中的操作數(shù)與0 相減。這個(gè)操作清零了v,然后依據(jù)測(cè)試的結(jié)果置位或者清零n 和z,依據(jù)在測(cè)試指令的結(jié)果而定。測(cè)試指令不改變測(cè)試數(shù)的值。bcd的計(jì)算的計(jì)算在bcd 碼數(shù)值中,16 進(jìn)制數(shù)表示一個(gè)有符號(hào)的十進(jìn)制數(shù)值0 到9。當(dāng)兩個(gè)8 位的bcd 數(shù)值相加,cpu 實(shí)際上執(zhí)行普通的二進(jìn)制加法。對(duì)于bcd 碼,這個(gè)計(jì)算的結(jié)果可能不再是一個(gè)有效的bcd 碼。根據(jù)add 或adc 指令對(duì)2 個(gè)標(biāo)準(zhǔn)的bcd 數(shù)計(jì)算所改變的h 和和c 標(biāo)志位標(biāo)志位,daa 指令可以對(duì)
17、結(jié)果進(jìn)行修正使其成為有效的有效的bcd 數(shù)并且修正數(shù)并且修正c 標(biāo)志位的內(nèi)容使其正確的表示使用bcd 加法后的結(jié)果。在過(guò)去完成這些操作是非常復(fù)雜的,需要測(cè)試每一個(gè)bcd 數(shù)值的結(jié)果和h、c 標(biāo)志位。而daa 指令則能很簡(jiǎn)單的完成這個(gè)操作。下面例子展示了2 種可能的情況:當(dāng)2 個(gè)8 位bcd 數(shù)據(jù)相加,并且使用daa 指令對(duì)其進(jìn)行修正,以修正bcd 和設(shè)置進(jìn)位標(biāo)志位。第一個(gè)例子展示了一種情況,bcd碼加法后結(jié)果不需要調(diào)整。第二個(gè)例子展示了另一種情況,bcd 碼加法后需要對(duì)結(jié)果調(diào)整。在第二個(gè)例子中daa 指令對(duì)數(shù)值加上了一個(gè)修正的因數(shù)并且調(diào)整了進(jìn)位標(biāo)志使其正確表示bcd 加法的結(jié)果。lda #$1
18、1 ;bcd 11add #$22 ;11 + 22 = 33daa ;在這個(gè)情況中沒有調(diào)整lda #$59 ;bcd 59add #$57 ;59+57=$b0;c=0,h=1,a=$b0 ;想得到59+57=116或者當(dāng)進(jìn)位置位時(shí)a=$16daa ;加$66和設(shè)置進(jìn)位;$b0+$66=$16進(jìn)位置位邏輯操作指令 24邏輯操作指令 24這些指令執(zhí)行8 位操作數(shù)的并行布爾運(yùn)算。邏輯指令均包括了兩個(gè)操作數(shù),一個(gè)是累加器a,另一個(gè)在存儲(chǔ)器中。立即尋址、直接尋址、擴(kuò)展尋址或變址尋址等尋址方式(和h:x 或者sp 相關(guān))也允許用來(lái)訪問操作數(shù)。累加器的每個(gè)位都執(zhí)行與、或和異或操作。邏輯操作的結(jié)果返回累加
19、器,覆蓋原來(lái)的操作數(shù)。lda #$0c ;位形式為00001100and #$0a ;位格式為00001010;結(jié)果是$08 .00001000lda #$35 ;位格式為00110101and #$0f ;位格式為00001111;結(jié)果是 $05 .00000101邏輯操作指令從示例中可看出這些操作和bclr 指令之間有些類似的地方。然而,bclr 僅能夠在$0000$00ff 存儲(chǔ)區(qū)間使用,and 能夠清零任何合并位,而bclr 僅能夠清零一位。and 能在幾個(gè)不同的尋址方式下使用與a 運(yùn)算的存儲(chǔ)操作數(shù)。lda #$0c ;位格式為00001100ora #$0a ;位格式為0000101
20、0;結(jié)果是 $0e ;00001110ora 操作和bset 指令之間有一些類似的地方。然而,bset 僅僅被使用在存儲(chǔ)區(qū)$0000$00ff,ora 能夠設(shè)置任何合并位,而bset 僅能夠置位一位。ora 能在幾個(gè)不同的尋址方式下使用與a 運(yùn)算的存儲(chǔ)操作數(shù)。邏輯操作指令a6 0c lda #$0c ;位格式為00001100a8 0a eor #$0a ;位格式為00001010;結(jié)果是 $06 ;00000110b6 00 lda ptad ;讀i/o端口aa8 03 eor #$03 ;低兩位異或操作b7 00 sta ptad ;更新i/o端口a“異或”常在操作數(shù)中用來(lái)鉗制某些位,有時(shí)
21、被認(rèn)為是掩碼,每個(gè)位在掩碼通信時(shí)被設(shè)置成在另外的操作碼有效位并被反向鉗制。下面的例子是讀i/o 端口,異或通過(guò)直接掩碼值$03 鉗制兩個(gè)最小的有效位,然后向i/o 端口寫入更新的結(jié)果。邏輯操作指令lda #$c5 ;位格式為11000101coma ;結(jié)果是00111010取反指令簡(jiǎn)單的轉(zhuǎn)換操作數(shù)的每個(gè)位,不要和求補(bǔ)指令相混淆,取負(fù)指令執(zhí)行的是一條算術(shù)運(yùn)算指令,即等效于與一個(gè)負(fù)1 相乘。位操作指令 14位測(cè)試指令(邏輯操作)bclr n,addr8 (其實(shí)是8條指令,見下頁(yè))bset n,addr8 ( 8 )位操作指令 14位操作指令 14位測(cè)試指令(邏輯操作)位指令將相應(yīng)存儲(chǔ)地址中的操作數(shù)
22、與a 寄存器的每個(gè)位進(jìn)行“與操作”(就像a 與),但是結(jié)果不存儲(chǔ)在累加器中。在執(zhí)行位指令后,根據(jù)與操作的結(jié)果來(lái)置位或清零條件碼寄存器n 和z 位,以實(shí)現(xiàn)條件跳轉(zhuǎn)。如果使用“掩碼”方法進(jìn)行編程,則掩碼中的每個(gè)對(duì)應(yīng)位被測(cè)試,執(zhí)行bit 指令后,若測(cè)試位均不是1 則z 位被置位。位操作指令 14位測(cè)試指令lda sci1s1 ;讀sci狀態(tài)寄存器bit #(mor+mnf+mfe+mpf) ;所有的錯(cuò)誤標(biāo)志的掩碼bne scierror ;如果有任何的錯(cuò)誤標(biāo)志被置位則轉(zhuǎn)移;a中值未被改變scierror:; 如果有任何的錯(cuò)誤標(biāo)志被置位,則跳轉(zhuǎn)到此例如用于判斷sci1s1 中有關(guān)錯(cuò)誤標(biāo)志位的掩碼:mo
23、r equ %00001000 ;接收超時(shí)的掩碼mnf equ %00000100 ;接收干擾標(biāo)志的掩碼mfe equ %00000010 ;接收端幀差錯(cuò)的掩碼mpf equ %00000001 ;接收端奇偶校驗(yàn)失敗的掩碼如果希望當(dāng)sci1s1 中至少有一個(gè)錯(cuò)誤標(biāo)志被置位時(shí)轉(zhuǎn)移,則采用復(fù)合掩碼:#(mor+mnf+mfe+mpf)。上述程序則采用這種方法.位操作指令 14位的置位與清零位的置位與清零 讀修改寫位的置位(bset)與清零(bclr)指令被認(rèn)為是位級(jí)的存儲(chǔ)指令,但是這些指令通常取一個(gè)完整的8位的數(shù),修改指定的位,然后重寫整個(gè)8 位的數(shù)。在某些情況下,例如當(dāng)目標(biāo)位置與ram 變量不對(duì)
24、應(yīng)時(shí),這個(gè)微妙的操作將導(dǎo)致意想不到的結(jié)果。如果bset或bclr 指令試圖改變非易失性存儲(chǔ)單元的某一位,通常這一位不會(huì)改變因?yàn)榉且资源鎯?chǔ)器要求更復(fù)雜的操作步驟來(lái)改變這一位。某些狀態(tài)位是通過(guò)一定步驟清零的,這一步驟包括讀取狀態(tài)位后寫入到外設(shè)模塊的其他寄存器。使用者會(huì)驚訝的發(fā)現(xiàn)bset 和bclr 指令能滿足讀取狀態(tài)寄存器的要求。為了避免這樣的問題,只要記住bset 和bclr 指令是能并行讀取8 位數(shù)據(jù)的讀-改-寫指令。某些控制寄存器或i/o 寄存器不能夠讀寫同一物理邏輯狀態(tài)。一般來(lái)說(shuō),在這些地址區(qū)域不使用讀-改-寫指令,因?yàn)樗鼈円苍S會(huì)產(chǎn)生意想不到的結(jié)果。bset 和bclr 指令能滿足讀取狀
25、態(tài)寄存器的要求.;置位的例子 打開te而不需要改變r(jià)e16 1b bset te,sci1c2 ;sci傳輸使能;功能上與下面是相同的b6 1b lda sci1c2 ;讀當(dāng)前sccr2的值aa 08 ora #mte ;te位上或操作(屏蔽)b7 1b sta sci1c2 ;更新sccr2中的值置位和清零進(jìn)位位指令(sec 和clc),可以用于,在執(zhí)行左移或右移指令前,改變進(jìn)位位的值。 置位中斷屏蔽(sei)和清零中斷屏蔽(cli)指令被用來(lái)讓中斷使能和禁止。復(fù)位后,在堆棧指針和其他系統(tǒng)條件初始化之前,i 位需要被置位用來(lái)防止中斷。當(dāng)完成足夠的系統(tǒng)初始化后,需要用cli 指令來(lái)放開中斷。在
26、某些程序中,敏感的代碼序列需要預(yù)防中斷。當(dāng)編寫敏感代碼序列時(shí),sei 在序列之前使用,cli 在序列之后使用。移位類指令 36移位類指令 36所有的移位類指令在由8 位的a、x 或者存儲(chǔ)器空間和在ccr 中的c 位組成的位組成的9位位空間上操作。附圖描述了在指令執(zhí)行時(shí)c 位如何配合左移位或者右移位操作。邏輯左移指令就是簡(jiǎn)單地把0 移位到有效值的最低位,最高位移位到進(jìn)位位。算術(shù)移位指令將左移的值作為有符號(hào)二進(jìn)制補(bǔ)碼來(lái)處理。算術(shù)左移類似于乘2 操作,算術(shù)右移類似于除2 操作。算術(shù)右移(asr)指令復(fù)制最初的最高有效位(msb)返回到msb,以保護(hù)操作數(shù)符號(hào)。asl 和lsl 就像相同指令不同的寫法
27、,因?yàn)樵谶壿嫼退阈g(shù)左右移位上,均沒有功能上的較大區(qū)別。移位類指令 36在移位中包含了進(jìn)位,移位允許將這些操作擴(kuò)展成多字節(jié)操作。下面的例子展示了一個(gè)24 位值被左移或者右移。;24位的左移操作clc ;清零c位rol sum24+2 ;c位轉(zhuǎn)移到低字節(jié)的最低位rol sum24+1 ;轉(zhuǎn)移中間字節(jié)rol sum24 ;轉(zhuǎn)移高字節(jié)lsl sum24+2;24位的右移操作?跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令 501、無(wú)條件跳轉(zhuǎn)和轉(zhuǎn)移指令 7條branch alwaysbranch never1、無(wú)條件跳轉(zhuǎn)和轉(zhuǎn)移指令跳轉(zhuǎn)(jmp),轉(zhuǎn)移(bra)和無(wú)轉(zhuǎn)移(brn)指令是無(wú)條件的,不依靠任何ccr 位的狀態(tài)。jm
28、p 可以跳轉(zhuǎn)到64k 字節(jié)地址空間的任何一個(gè)位置,而轉(zhuǎn)移指令被限制在當(dāng)前位置的-128 到+127 的區(qū)域空間。下面例子的指令使用了使用了jmp 指令來(lái)擴(kuò)展條件轉(zhuǎn)移的范圍指令來(lái)擴(kuò)展條件轉(zhuǎn)移的范圍。對(duì)每一個(gè)條件轉(zhuǎn)移指令來(lái)說(shuō),均有相反條件操作的轉(zhuǎn)移指令存在。例如相對(duì)轉(zhuǎn)移指令,就有相等轉(zhuǎn)移指令(beq)和不相等轉(zhuǎn)移指令(bne)等等。假如寫出了下面的指令。;beq faraway ;多于128字節(jié)匯編程序就會(huì)標(biāo)志出一個(gè)錯(cuò)誤,因?yàn)槌^(guò)了128 字節(jié)的距離.也可以使用bne 來(lái)替換beq,那執(zhí)行起來(lái)就像下面這個(gè)跳轉(zhuǎn)指令了。bne aroundj ;如果不相等則轉(zhuǎn)移jmp faraway ;如果相等則轉(zhuǎn)移
29、aroundj: ;如果不相等轉(zhuǎn)移到這里跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令2、簡(jiǎn)單轉(zhuǎn)移指令 12條branch if equalbranch if carry bit clearbranch if not equalbranch if carry bit setbranch if plusbranch if minusbranch if irq pin lowbranch if irq pin highbranch if interrupt mask clearbranch if half carry bit clear跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令2、簡(jiǎn)單轉(zhuǎn)移指令 狀態(tài)位與指令對(duì)照跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令3
30、、有符號(hào)數(shù)轉(zhuǎn)移指令 4條branch if less thanbranch if less than or equalbranch if greater than or equalbranch if greater than有符號(hào)數(shù)的操作均可使用于諸如:小于轉(zhuǎn)移(blt),小于等于轉(zhuǎn)移(ble),大于等于轉(zhuǎn)移(bge)和大于轉(zhuǎn)移(bgt)等指令。簡(jiǎn)單轉(zhuǎn)移中的相等轉(zhuǎn)移(beq)和不相等轉(zhuǎn)移(ben)等指令也可用于有符號(hào)數(shù)。m68hc05 系列沒有ccr 中v 位,因此它不能夠進(jìn)行有符號(hào)轉(zhuǎn)移。有符號(hào)和無(wú)符號(hào)轉(zhuǎn)移的不同點(diǎn)是有符號(hào)轉(zhuǎn)移使用n和v的異或來(lái)代替c 位作為控制轉(zhuǎn)移的布爾條件。n 和v 的異或
31、提供了一個(gè)高于+127(+32,767)或者低于128(32,768)溢出標(biāo)志。c 位超過(guò)+255(+65,535)就顯示出溢出。跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令4、無(wú)符號(hào)數(shù)轉(zhuǎn)移指令 4條小于轉(zhuǎn)移(blo)、小于等于轉(zhuǎn)移(bls)、大于等于轉(zhuǎn)移(bhs)和大于轉(zhuǎn)移(bhi)用在無(wú)符號(hào)數(shù)運(yùn)算。簡(jiǎn)單轉(zhuǎn)移、相等轉(zhuǎn)移和不相等轉(zhuǎn)移也能用在無(wú)符號(hào)數(shù)運(yùn)算。branch if lowersame as bcsbranch if lower or samebranch if higher or samesame as bccbranch if higher跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令5、位條件轉(zhuǎn)移指令 2條這些轉(zhuǎn)移指令測(cè)試
32、直接尋址空間($0000$00ff)中的操作數(shù)的一個(gè)單獨(dú)的位,如果測(cè)試位被置1,brset 則跳轉(zhuǎn),如果測(cè)試位為0,brclr 則跳轉(zhuǎn)。盡管這個(gè)操作數(shù)看起來(lái)像被限制在存儲(chǔ)位置上,但它包含了所有的i/o 和控制寄存器空間和一些ram 中的一部分重要的位置,這些位置用來(lái)存放程序中的變量。對(duì)于每個(gè)位置都有獨(dú)立的操作數(shù),這些指令有著特別的效果,僅需要3 字節(jié)的目標(biāo)代碼和5 個(gè)總線周期。waitrdrf: brclr rdrf,sci1s1,waitrdrf ;等待rdrf被置位brclr onesecond,flags,skipupdateupdatetime: bclr onesecond,flag
33、s ;清除布爾變量skipupdate:跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令5、循環(huán)控制指令 12條cbeq 指令比較累加器和某個(gè)存儲(chǔ)位置的內(nèi)容,如果它們彼此相等就跳轉(zhuǎn)。cbeqa和cbeqx 允許寄存器a 或x 與一個(gè)立即數(shù)相比較。與cbeq 指令相關(guān)的h:x 變址操作的特殊點(diǎn)是當(dāng)比較a 和變址存儲(chǔ)位置的內(nèi)容后h:x 會(huì)自動(dòng)增加。這些變化可被用來(lái)尋找存儲(chǔ)器中特殊的值,例如字符串最后的空值、一個(gè)返回值或一個(gè)結(jié)束標(biāo)志。cbeq其他的變化可用來(lái)作為存儲(chǔ)區(qū)域的循環(huán)記數(shù)(增加或減少該循環(huán)記數(shù)可通過(guò)另外的在循環(huán)中的指令來(lái)實(shí)現(xiàn))。compare and branch if equal decrement and br
34、anch if not zero lda #$0d ;ascii cbeq opra,gotcr ;如果立即數(shù)等于$0d則跳轉(zhuǎn)。;這里的立即數(shù)可以是任何數(shù)除了gotcr: ;如果立即數(shù)是則跳轉(zhuǎn);相似的,但是立即數(shù)尋址方式代替了直接尋址方式lda sci1drl ;read sci character ;讀sci字符cbeq #$0d,gotcr ;如果它是則跳轉(zhuǎn)前面對(duì)于尋址方式的講解中也有cbeq的例子。dbnz 指令對(duì)寄存器a、x 或存儲(chǔ)區(qū)域的值減1,如果結(jié)果值不為0 便轉(zhuǎn)移。這提供了一個(gè)有效的實(shí)現(xiàn)循環(huán)計(jì)數(shù)的方法。lda#4 ;循環(huán)記數(shù)stadirectbyte ;保存在ram中l(wèi)oopto
35、p: nop ;開始程序循環(huán)dbnz directbyte,looptop ; 循環(huán)直到計(jì)數(shù)值到;在堆棧中使用局部量來(lái)循環(huán)記數(shù)lda#4 ;循環(huán)記數(shù)psha;將循環(huán)記數(shù)壓棧looptop1: nop ;開始程序循環(huán)dbnz 1,sp,looptop1 ;循環(huán)直到計(jì)數(shù)值到跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令6、子程操作類指令 9條jump to subroutine branch to subroutine software interrupt1中斷入口低優(yōu)先級(jí)高中斷號(hào)入口地址模塊標(biāo)記允許位寄存器230 xffd0:ffd1系統(tǒng)rtifrtiesrtisc200 xffd6:ffd7acmpacfaciea
36、cmpsc190 xffd8:ffd9adccocoaienadcsc1180 xffda:ffdbkbikbfkbiekbisc170 xffdc:ffddiiciicifiicieiicc,iics160 xffde:ffdfscitdre、tctie、tciescic2150 xffe0:ffe1sci idle、rdrfilie、riescis1140 xffe2:ffe3scior,nf,fe,pforiescic3130 xffe4:ffe5spispif,modf,sptefspie,sptiespic1120 xffe6:ffe7 mtimtoftoiemtimsc70 xff
37、f0:fff1tpmtoftoietpmsc60 xfff2:fff3tpmch1fch1ietpmc1sc50 xfff4:fff5tpmch0fchi0ietpmc0sc30 xfff8:fff9系統(tǒng)lvdflvdiespmsc120 xfffa:fffbirqirqfirqieirqsc10 xfffc:fffdcpuswi指令-00 xfffe:ffff系統(tǒng)cop,lvd,rst,por,非法指令等。跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令6、子程操作類指令 9條return from subroutinereturn from interrupt無(wú)條件跳轉(zhuǎn)到子程序(jsr)和轉(zhuǎn)移到子程序(bsr)指令用于轉(zhuǎn)到程序中某個(gè)位置
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中信息技術(shù)課程介紹
- 布加氏綜合征CT診斷
- 產(chǎn)業(yè)轉(zhuǎn)移與鄉(xiāng)村振興2025年園區(qū)社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估
- 人工智能在制造業(yè)中的應(yīng)用與科技互聯(lián)網(wǎng)產(chǎn)業(yè)升級(jí)報(bào)告
- 二零二五年北京聯(lián)通5G套餐預(yù)存優(yōu)惠使用合同
- 二零二五年度n95口罩采購(gòu)及用戶隱私保護(hù)協(xié)議
- 二零二五年度PK旅游目的地開發(fā)合作協(xié)議
- 二零二五年度搬家運(yùn)輸貨物及智能家居搬運(yùn)合同
- 二零二五年度智能家居安防設(shè)備安裝與維護(hù)合同
- 二零二五年度辦公室裝修合同(含綠化設(shè)計(jì))精簡(jiǎn)版
- 百靈達(dá)x32數(shù)字調(diào)音臺(tái)說(shuō)明書簡(jiǎn)體中文
- GA/T 947.2-2015單警執(zhí)法視音頻記錄系統(tǒng)第2部分:執(zhí)法記錄儀
- 職業(yè)技能培訓(xùn)鑒定教材編寫規(guī)定
- 噴霧干燥器課程設(shè)計(jì)終稿
- 2023年濰坊市交通投資有限公司招聘筆試題庫(kù)及答案解析
- 住院醫(yī)師規(guī)范化培訓(xùn)小講課教學(xué)設(shè)計(jì)課件
- 酸化土壤改良技術(shù)規(guī)范DB50-T 1146-2021
- 英威騰GD變頻器調(diào)試說(shuō)明
- 季節(jié)性施工專項(xiàng)施工方案(常用)
- 倉(cāng)庫(kù)作業(yè)指導(dǎo)書
- DB13T 2906-2018 非煤礦山井下民用爆炸物品儲(chǔ)存庫(kù)安全規(guī)范
評(píng)論
0/150
提交評(píng)論