版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
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ù)傳送指令這組指令用于存儲器和cpu 寄存器間、存儲器單元間或者cpu 寄存器間的數(shù)據(jù)轉(zhuǎn)移。讀入、存儲和數(shù)據(jù)傳送等指令根據(jù)數(shù)據(jù)的值自動更新條件碼自動更新條件碼。這允許beq、bne、bpl 和bmi 等在載入、儲存和數(shù)據(jù)傳送指令后不需要運(yùn)行特殊的測試或比較指令,而立即進(jìn)行條件轉(zhuǎn)移。l
2、oad a 和load x是從存儲器中取出一個8位數(shù)放入累加器a或寄存器x。load h:x是從存儲器中取出8位的數(shù)放入寄存器h,然后再從下一個存儲單元取出8位數(shù)放入寄存器x。為了盡可能靈活的訪問存儲器,加載a 或x 都可使用8 種不同的尋址方式。而ldhx 可有7種不同的尋址方式來指定所取數(shù)的存儲單元。下列代碼展示了加載指令的某些用法。這些指令在實(shí)際程序中并不這樣用,它們只是些無關(guān)聯(lián)的加載指令,用來說明可用不同方式來訪問存儲器的多種可行的尋址方式.因?yàn)椴僮鲾?shù)進(jìn)入alu 需要用到累加器a,所以通常在執(zhí)行算術(shù)與邏輯操作時,要使用lda 指令取得一個值,以便與第2 個操作數(shù)進(jìn)行運(yùn)算。;求a+b的和
3、(假設(shè)總和累加器add oprb ;立即數(shù)a+立即數(shù)b-累加器在有些情況下,可設(shè)計程序使得放在累加器a 中的運(yùn)算結(jié)果能用來作為后續(xù)運(yùn)算的操作數(shù)。這樣可以避免存儲結(jié)果的過程以及將下一個操作數(shù)放入累加器的必要。;求a+b+c的和(假設(shè)總和累加器add oprb ;立即數(shù)a+立即數(shù)b-累加器add oprc ;累加器+立即數(shù)c-累加器下面展示了中間值保存在堆棧中的例程。有時這樣做比將臨時結(jié)果存儲在存儲器中要快。存儲的數(shù)量依賴于用何種尋址方式放置臨時變量至存儲器以及x 寄存器是否被其他操作所使用.;計算(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 ;釋放一個變量tax 和txa 提供了一個有效的方法來把a(bǔ) 寄存器的值送到x 寄存器或者把寄存器x 的值送到寄存器a。如果寄存器x 未被使用,可以用來暫存累加器a 中的值,這樣累加器就可以用來做其他操作。tap 和tpa 提供了一個方法在寄存器a 到ccr 中或者從ccr 到寄存器a 傳送數(shù)據(jù)。這種操作在類似調(diào)試監(jiān)控等開發(fā)工具中比在通常用戶程序中使用得更多。mov指令從存儲器區(qū)讀一個
5、8 位數(shù)值,并將這個數(shù)值存儲到存儲區(qū)的其他地方。就像加載和存儲指令一樣,mov 根據(jù)被移動數(shù)據(jù)的值改變ccr 中n 和和z 標(biāo)志位。盡管加載和存儲指令能夠完成盡管加載和存儲指令能夠完成mov 所做的事情,但mov 不需要使用累加器,在傳送操作期間,累加器a 能夠正常使用。在許多情況下,mov 比加載-存儲指令更快更小(目標(biāo)代碼的大小)。mov 指令允許四種從指定源到目標(biāo)的不同的尋址方式。下面的例子展示了使用傳送指令初始化幾個寄存器的值。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位下面例子展示了使用加載和存儲指令實(shí)現(xiàn)字符串移動字符串移動操作數(shù),而不用傳送指令。;塊移動例子,移動字符串到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 ;下一個位置(假設(shè)直接尋址)20 f7 bra movloop1 ;繼續(xù)循環(huán) dunloop1: 算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令包含了
7、傳統(tǒng)的加、減、乘和除操作,還包含常用的指令如加一、減一、清零、求補(bǔ)(2 進(jìn)制補(bǔ)碼)、比較、測試和為處理bcd 碼的十進(jìn)制調(diào)整指令。比較指令實(shí)際上就是減操作,影響ccr 狀態(tài)位但結(jié)果不返回到cpu 寄存器。測試指令影響著n和z 位,但是不影響被測試的數(shù)據(jù)。add 指令將寄存器a 中的數(shù)據(jù)加上存儲器內(nèi)的操作數(shù),并將結(jié)果存儲到寄存器a中。adc 將寄存器a 中的數(shù)據(jù)加上由前一次操作產(chǎn)生的進(jìn)位,再加上存儲器中的操作數(shù),將結(jié)果存儲到寄存器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ù)減去存儲器中的數(shù)據(jù),然后將結(jié)果存儲到累加器a中。對于這個指令,進(jìn)位狀態(tài)位是借位指示器。sbc 指令將累加器a 中的數(shù)據(jù)減去由前一次操作所影響的借位再減去存儲器中的數(shù)據(jù),然后將結(jié)果存儲回寄存器a 中。這個操作允許執(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中無符號8位2進(jìn)制數(shù)與累加器a中的無符號的8 位2進(jìn)制數(shù)相乘,然后存儲16位結(jié)果到x:a 中,高8 位的結(jié)果存儲在x中,低8位存儲在a中。這種情況下不可能發(fā)生進(jìn)位(或者是溢出),其結(jié)果將總是適合x:a 的大小。因此在這個操作后c 將被清零。div 將h:a 中16 位無符號數(shù)除以x中無符號的8位值,然后存
10、儲8位結(jié)果到a寄存器中,余數(shù)存儲到h寄存器中。在x中的除數(shù)無變化,因此他能夠在隨后的操作中被使用。如果商為0則z標(biāo)志被置1。如果商大于255 就會有溢出發(fā)生,如果發(fā)生溢出或除數(shù)為0 則c 位被置1。下面這個除法的例子展示了簡單8 位除以8 位得到一個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é)果另一個除法的例子證明了怎樣使用div 指令來執(zhí)行一個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ù)部分第三個除法的例子。用一個8 位的被除數(shù)來除一個大于8 位的除數(shù)得到16 位的小數(shù)結(jié)果,小數(shù)點(diǎn)在結(jié)果最高位的左邊。在二進(jìn)制中,msb 的數(shù)值是整個數(shù)值的一半,右邊的下一位占四分之一,依次類
12、推。;8/8小數(shù)除法,16位的小數(shù)結(jié)果;r16=h/x,結(jié)果是一個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é)第四個除法例子使用了類似長除法的技術(shù),完成16 位整數(shù)除以8 位的數(shù)的操作.;極大的16/8整數(shù)除法(相當(dā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é)果的下一個字節(jié)clra ;h:a=余數(shù):0div ;h:a/x-asta quotient24+2 ;結(jié)果的小數(shù)位第五個例子展示了通過檢查溢出來實(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ǔ) 加一與減一指令可以通過加1 或減1 調(diào)整寄存器a、x 或存儲器或存儲器內(nèi)的數(shù)據(jù)。清零指令可以將寄存器a、x、h 或者存儲器中的8 位數(shù)值強(qiáng)制改為0。求補(bǔ)指令執(zhí)行了二進(jìn)制補(bǔ)碼操作,求補(bǔ)指令等同于將一個8 位有符號數(shù)乘以-1。功能上等同于將寄存器a、x 或者存儲器中的數(shù)據(jù)全部全
15、部取反,然后加上一取反,然后加上一。數(shù)據(jù)$80 表示有符號數(shù)值負(fù)128,而不是+128。因?yàn)槭褂? 位2 進(jìn)制補(bǔ)碼所能表示的最大是+127。如果寄存器的值是$80 然后若執(zhí)行nega 指令,cpu 首先反轉(zhuǎn)所有的位獲得$7f,然后再加1 得$80。因?yàn)檫@個原因如果一個數(shù)據(jù)的符號由正變負(fù),在ccr 中的v 標(biāo)志位將標(biāo)示為溢出錯誤。比較和測試比較和測試cmp 指令影響ccr 的位,就像相應(yīng)的sub 指令。但其結(jié)果不會存儲回累加器中,因此a 寄存器和存儲器操作數(shù)是不發(fā)生變化的。比較指令是比較寄存器a、x 或h:x內(nèi)容與存儲器中的操作數(shù)。在cphx 指令執(zhí)行時,m 指向存儲位置的首地址,h 與存儲器位
16、置m 相對應(yīng),x 和存儲器位置m+1 相對應(yīng)。cphx 執(zhí)行一個16 位減法指令(存儲結(jié)果不返回h:x 中)。測試指令是將寄存器a、x 或者存儲器中的操作數(shù)與0 相減。這個操作清零了v,然后依據(jù)測試的結(jié)果置位或者清零n 和z,依據(jù)在測試指令的結(jié)果而定。測試指令不改變測試數(shù)的值。bcd的計算的計算在bcd 碼數(shù)值中,16 進(jìn)制數(shù)表示一個有符號的十進(jìn)制數(shù)值0 到9。當(dāng)兩個8 位的bcd 數(shù)值相加,cpu 實(shí)際上執(zhí)行普通的二進(jìn)制加法。對于bcd 碼,這個計算的結(jié)果可能不再是一個有效的bcd 碼。根據(jù)add 或adc 指令對2 個標(biāo)準(zhǔn)的bcd 數(shù)計算所改變的h 和和c 標(biāo)志位標(biāo)志位,daa 指令可以對
17、結(jié)果進(jìn)行修正使其成為有效的有效的bcd 數(shù)并且修正數(shù)并且修正c 標(biāo)志位的內(nèi)容使其正確的表示使用bcd 加法后的結(jié)果。在過去完成這些操作是非常復(fù)雜的,需要測試每一個bcd 數(shù)值的結(jié)果和h、c 標(biāo)志位。而daa 指令則能很簡單的完成這個操作。下面例子展示了2 種可能的情況:當(dāng)2 個8 位bcd 數(shù)據(jù)相加,并且使用daa 指令對其進(jìn)行修正,以修正bcd 和設(shè)置進(jìn)位標(biāo)志位。第一個例子展示了一種情況,bcd碼加法后結(jié)果不需要調(diào)整。第二個例子展示了另一種情況,bcd 碼加法后需要對結(jié)果調(diào)整。在第二個例子中daa 指令對數(shù)值加上了一個修正的因數(shù)并且調(diào)整了進(jìn)位標(biāo)志使其正確表示bcd 加法的結(jié)果。lda #$1
18、1 ;bcd 11add #$22 ;11 + 22 = 33daa ;在這個情況中沒有調(diào)整lda #$59 ;bcd 59add #$57 ;59+57=$b0;c=0,h=1,a=$b0 ;想得到59+57=116或者當(dāng)進(jìn)位置位時a=$16daa ;加$66和設(shè)置進(jìn)位;$b0+$66=$16進(jìn)位置位邏輯操作指令 24邏輯操作指令 24這些指令執(zhí)行8 位操作數(shù)的并行布爾運(yùn)算。邏輯指令均包括了兩個操作數(shù),一個是累加器a,另一個在存儲器中。立即尋址、直接尋址、擴(kuò)展尋址或變址尋址等尋址方式(和h:x 或者sp 相關(guān))也允許用來訪問操作數(shù)。累加器的每個位都執(zhí)行與、或和異或操作。邏輯操作的結(jié)果返回累加
19、器,覆蓋原來的操作數(shù)。lda #$0c ;位形式為00001100and #$0a ;位格式為00001010;結(jié)果是$08 .00001000lda #$35 ;位格式為00110101and #$0f ;位格式為00001111;結(jié)果是 $05 .00000101邏輯操作指令從示例中可看出這些操作和bclr 指令之間有些類似的地方。然而,bclr 僅能夠在$0000$00ff 存儲區(qū)間使用,and 能夠清零任何合并位,而bclr 僅能夠清零一位。and 能在幾個不同的尋址方式下使用與a 運(yùn)算的存儲操作數(shù)。lda #$0c ;位格式為00001100ora #$0a ;位格式為0000101
20、0;結(jié)果是 $0e ;00001110ora 操作和bset 指令之間有一些類似的地方。然而,bset 僅僅被使用在存儲區(qū)$0000$00ff,ora 能夠設(shè)置任何合并位,而bset 僅能夠置位一位。ora 能在幾個不同的尋址方式下使用與a 運(yùn)算的存儲操作數(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ù)中用來鉗制某些位,有時
21、被認(rèn)為是掩碼,每個位在掩碼通信時被設(shè)置成在另外的操作碼有效位并被反向鉗制。下面的例子是讀i/o 端口,異或通過直接掩碼值$03 鉗制兩個最小的有效位,然后向i/o 端口寫入更新的結(jié)果。邏輯操作指令lda #$c5 ;位格式為11000101coma ;結(jié)果是00111010取反指令簡單的轉(zhuǎn)換操作數(shù)的每個位,不要和求補(bǔ)指令相混淆,取負(fù)指令執(zhí)行的是一條算術(shù)運(yùn)算指令,即等效于與一個負(fù)1 相乘。位操作指令 14位測試指令(邏輯操作)bclr n,addr8 (其實(shí)是8條指令,見下頁)bset n,addr8 ( 8 )位操作指令 14位操作指令 14位測試指令(邏輯操作)位指令將相應(yīng)存儲地址中的操作數(shù)
22、與a 寄存器的每個位進(jìn)行“與操作”(就像a 與),但是結(jié)果不存儲在累加器中。在執(zhí)行位指令后,根據(jù)與操作的結(jié)果來置位或清零條件碼寄存器n 和z 位,以實(shí)現(xiàn)條件跳轉(zhuǎn)。如果使用“掩碼”方法進(jìn)行編程,則掩碼中的每個對應(yīng)位被測試,執(zhí)行bit 指令后,若測試位均不是1 則z 位被置位。位操作指令 14位測試指令lda sci1s1 ;讀sci狀態(tài)寄存器bit #(mor+mnf+mfe+mpf) ;所有的錯誤標(biāo)志的掩碼bne scierror ;如果有任何的錯誤標(biāo)志被置位則轉(zhuǎn)移;a中值未被改變scierror:; 如果有任何的錯誤標(biāo)志被置位,則跳轉(zhuǎn)到此例如用于判斷sci1s1 中有關(guān)錯誤標(biāo)志位的掩碼:mo
23、r equ %00001000 ;接收超時的掩碼mnf equ %00000100 ;接收干擾標(biāo)志的掩碼mfe equ %00000010 ;接收端幀差錯的掩碼mpf equ %00000001 ;接收端奇偶校驗(yàn)失敗的掩碼如果希望當(dāng)sci1s1 中至少有一個錯誤標(biāo)志被置位時轉(zhuǎn)移,則采用復(fù)合掩碼:#(mor+mnf+mfe+mpf)。上述程序則采用這種方法.位操作指令 14位的置位與清零位的置位與清零 讀修改寫位的置位(bset)與清零(bclr)指令被認(rèn)為是位級的存儲指令,但是這些指令通常取一個完整的8位的數(shù),修改指定的位,然后重寫整個8 位的數(shù)。在某些情況下,例如當(dāng)目標(biāo)位置與ram 變量不對
24、應(yīng)時,這個微妙的操作將導(dǎo)致意想不到的結(jié)果。如果bset或bclr 指令試圖改變非易失性存儲單元的某一位,通常這一位不會改變因?yàn)榉且资源鎯ζ饕蟾鼜?fù)雜的操作步驟來改變這一位。某些狀態(tài)位是通過一定步驟清零的,這一步驟包括讀取狀態(tài)位后寫入到外設(shè)模塊的其他寄存器。使用者會驚訝的發(fā)現(xiàn)bset 和bclr 指令能滿足讀取狀態(tài)寄存器的要求。為了避免這樣的問題,只要記住bset 和bclr 指令是能并行讀取8 位數(shù)據(jù)的讀-改-寫指令。某些控制寄存器或i/o 寄存器不能夠讀寫同一物理邏輯狀態(tài)。一般來說,在這些地址區(qū)域不使用讀-改-寫指令,因?yàn)樗鼈円苍S會產(chǎn)生意想不到的結(jié)果。bset 和bclr 指令能滿足讀取狀
25、態(tài)寄存器的要求.;置位的例子 打開te而不需要改變re16 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)指令被用來讓中斷使能和禁止。復(fù)位后,在堆棧指針和其他系統(tǒng)條件初始化之前,i 位需要被置位用來防止中斷。當(dāng)完成足夠的系統(tǒng)初始化后,需要用cli 指令來放開中斷。在
26、某些程序中,敏感的代碼序列需要預(yù)防中斷。當(dāng)編寫敏感代碼序列時,sei 在序列之前使用,cli 在序列之后使用。移位類指令 36移位類指令 36所有的移位類指令在由8 位的a、x 或者存儲器空間和在ccr 中的c 位組成的位組成的9位位空間上操作。附圖描述了在指令執(zhí)行時c 位如何配合左移位或者右移位操作。邏輯左移指令就是簡單地把0 移位到有效值的最低位,最高位移位到進(jìn)位位。算術(shù)移位指令將左移的值作為有符號二進(jìn)制補(bǔ)碼來處理。算術(shù)左移類似于乘2 操作,算術(shù)右移類似于除2 操作。算術(shù)右移(asr)指令復(fù)制最初的最高有效位(msb)返回到msb,以保護(hù)操作數(shù)符號。asl 和lsl 就像相同指令不同的寫法
27、,因?yàn)樵谶壿嫼退阈g(shù)左右移位上,均沒有功能上的較大區(qū)別。移位類指令 36在移位中包含了進(jìn)位,移位允許將這些操作擴(kuò)展成多字節(jié)操作。下面的例子展示了一個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、無條件跳轉(zhuǎn)和轉(zhuǎn)移指令 7條branch alwaysbranch never1、無條件跳轉(zhuǎn)和轉(zhuǎn)移指令跳轉(zhuǎn)(jmp),轉(zhuǎn)移(bra)和無轉(zhuǎn)移(brn)指令是無條件的,不依靠任何ccr 位的狀態(tài)。jm
28、p 可以跳轉(zhuǎn)到64k 字節(jié)地址空間的任何一個位置,而轉(zhuǎn)移指令被限制在當(dāng)前位置的-128 到+127 的區(qū)域空間。下面例子的指令使用了使用了jmp 指令來擴(kuò)展條件轉(zhuǎn)移的范圍指令來擴(kuò)展條件轉(zhuǎn)移的范圍。對每一個條件轉(zhuǎn)移指令來說,均有相反條件操作的轉(zhuǎn)移指令存在。例如相對轉(zhuǎn)移指令,就有相等轉(zhuǎn)移指令(beq)和不相等轉(zhuǎn)移指令(bne)等等。假如寫出了下面的指令。;beq faraway ;多于128字節(jié)匯編程序就會標(biāo)志出一個錯誤,因?yàn)槌^了128 字節(jié)的距離.也可以使用bne 來替換beq,那執(zhí)行起來就像下面這個跳轉(zhuǎn)指令了。bne aroundj ;如果不相等則轉(zhuǎn)移jmp faraway ;如果相等則轉(zhuǎn)移
29、aroundj: ;如果不相等轉(zhuǎn)移到這里跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令2、簡單轉(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、簡單轉(zhuǎn)移指令 狀態(tài)位與指令對照跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令3
30、、有符號數(shù)轉(zhuǎn)移指令 4條branch if less thanbranch if less than or equalbranch if greater than or equalbranch if greater than有符號數(shù)的操作均可使用于諸如:小于轉(zhuǎn)移(blt),小于等于轉(zhuǎn)移(ble),大于等于轉(zhuǎn)移(bge)和大于轉(zhuǎn)移(bgt)等指令。簡單轉(zhuǎn)移中的相等轉(zhuǎn)移(beq)和不相等轉(zhuǎn)移(ben)等指令也可用于有符號數(shù)。m68hc05 系列沒有ccr 中v 位,因此它不能夠進(jìn)行有符號轉(zhuǎn)移。有符號和無符號轉(zhuǎn)移的不同點(diǎn)是有符號轉(zhuǎn)移使用n和v的異或來代替c 位作為控制轉(zhuǎn)移的布爾條件。n 和v 的異或
31、提供了一個高于+127(+32,767)或者低于128(32,768)溢出標(biāo)志。c 位超過+255(+65,535)就顯示出溢出。跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令4、無符號數(shù)轉(zhuǎn)移指令 4條小于轉(zhuǎn)移(blo)、小于等于轉(zhuǎn)移(bls)、大于等于轉(zhuǎn)移(bhs)和大于轉(zhuǎn)移(bhi)用在無符號數(shù)運(yùn)算。簡單轉(zhuǎn)移、相等轉(zhuǎn)移和不相等轉(zhuǎn)移也能用在無符號數(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)移指令測試
32、直接尋址空間($0000$00ff)中的操作數(shù)的一個單獨(dú)的位,如果測試位被置1,brset 則跳轉(zhuǎn),如果測試位為0,brclr 則跳轉(zhuǎn)。盡管這個操作數(shù)看起來像被限制在存儲位置上,但它包含了所有的i/o 和控制寄存器空間和一些ram 中的一部分重要的位置,這些位置用來存放程序中的變量。對于每個位置都有獨(dú)立的操作數(shù),這些指令有著特別的效果,僅需要3 字節(jié)的目標(biāo)代碼和5 個總線周期。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 指令比較累加器和某個存儲位置的內(nèi)容,如果它們彼此相等就跳轉(zhuǎn)。cbeqa和cbeqx 允許寄存器a 或x 與一個立即數(shù)相比較。與cbeq 指令相關(guān)的h:x 變址操作的特殊點(diǎn)是當(dāng)比較a 和變址存儲位置的內(nèi)容后h:x 會自動增加。這些變化可被用來尋找存儲器中特殊的值,例如字符串最后的空值、一個返回值或一個結(jié)束標(biāo)志。cbeq其他的變化可用來作為存儲區(qū)域的循環(huán)記數(shù)(增加或減少該循環(huán)記數(shù)可通過另外的在循環(huán)中的指令來實(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)前面對于尋址方式的講解中也有cbeq的例子。dbnz 指令對寄存器a、x 或存儲區(qū)域的值減1,如果結(jié)果值不為0 便轉(zhuǎn)移。這提供了一個有效的實(shí)現(xiàn)循環(huán)計數(shù)的方法。lda#4 ;循環(huán)記數(shù)stadirectbyte ;保存在ram中l(wèi)oopto
35、p: nop ;開始程序循環(huán)dbnz directbyte,looptop ; 循環(huán)直到計數(shù)值到;在堆棧中使用局部量來循環(huán)記數(shù)lda#4 ;循環(huán)記數(shù)psha;將循環(huán)記數(shù)壓棧looptop1: nop ;開始程序循環(huán)dbnz 1,sp,looptop1 ;循環(huán)直到計數(shù)值到跳轉(zhuǎn)、轉(zhuǎn)移和循環(huán)控制指令6、子程操作類指令 9條jump to subroutine branch to subroutine software interrupt1中斷入口低優(yōu)先級高中斷號入口地址模塊標(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無條件跳轉(zhuǎn)到子程序(jsr)和轉(zhuǎn)移到子程序(bsr)指令用于轉(zhuǎn)到程序中某個位置
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽理工大學(xué)《電工與電子技術(shù)》2021-2022學(xué)年期末試卷
- 海南省房屋買賣合同
- 合同成立時間有關(guān)的案例
- 2024年隔斷房屋租賃合同范本
- 專題04 賞析描寫或修辭手法-2022-2023學(xué)年小升初語文記敘文知識點(diǎn)銜接(部編版)
- 2024報社廣告合同范文
- 聚眾淫亂罪的迷思與匡正-以南京副教授換偶
- 2024木質(zhì)框廣告制作安裝合同
- 2024新委托代理合同樣本
- 沈陽城市學(xué)院《婚姻繼承法》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣州數(shù)據(jù)資產(chǎn)管理及入表工作指引 2024
- 消防噴淋安裝承包合同(2024版)
- “雙減”小學(xué)語文六年級上冊單元作業(yè)設(shè)計案例
- 阿里巴巴員工紀(jì)律制度
- 商業(yè)銀行旺季營銷開門紅
- 2024版《保密法》培訓(xùn)課件
- 企業(yè)的所得稅自查報告5篇
- 2024-2030年輸液架行業(yè)市場現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評估規(guī)劃分析研究報告
- ??谑袊量臻g總體規(guī)劃(2020-2035)(公眾版)
- 備戰(zhàn)2024年高考英語考試易錯點(diǎn)25 語法填空:無提示詞之連詞(4大陷阱)(解析版)
- 安徽省淮南市2023-2024學(xué)年高一上學(xué)期第二次月考數(shù)學(xué)試題
評論
0/150
提交評論